├── requirements.txt ├── doc ├── build │ └── html │ │ ├── _static │ │ ├── custom.css │ │ ├── file.png │ │ ├── plus.png │ │ ├── minus.png │ │ ├── fonts │ │ │ ├── Lato-Bold.ttf │ │ │ ├── Lato-Bold.woff2 │ │ │ ├── Lato-Italic.ttf │ │ │ ├── Lato-Italic.woff2 │ │ │ ├── Lato-Regular.ttf │ │ │ ├── Lato-BoldItalic.ttf │ │ │ ├── Lato-Regular.woff2 │ │ │ ├── Lato-BoldItalic.woff2 │ │ │ ├── RobotoSlab-Bold.woff2 │ │ │ ├── RobotoSlab-Regular.woff2 │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── forkme_right_darkblue_121621.png │ │ ├── documentation_options.js │ │ ├── css │ │ │ └── badge_only.css │ │ ├── _sphinx_javascript_frameworks_compat.js │ │ ├── doctools.js │ │ ├── pygments.css │ │ ├── language_data.js │ │ ├── sphinx_highlight.js │ │ └── js │ │ │ └── versions.js │ │ ├── objects.inv │ │ ├── _images │ │ ├── fibsec_rc.png │ │ ├── fibsec_circ.png │ │ ├── fibsec_wshape.png │ │ ├── portal_frame-M.png │ │ ├── portal_frame-N.png │ │ ├── portal_frame-V.png │ │ ├── portal_frame_M.png │ │ ├── portal_frame_N.png │ │ ├── portal_frame_V.png │ │ ├── quads_4x4_defo.png │ │ ├── quads_4x4_sxx.png │ │ ├── quads_4x4_sxy.png │ │ ├── quads_4x4_syy.png │ │ ├── quads_4x4_vmis.png │ │ ├── truss_ex1_defo.png │ │ ├── quads_4x4_model.png │ │ ├── portal_frame-defo.png │ │ ├── portal_frame-loads.png │ │ ├── portal_frame_defo.png │ │ ├── portal_frame_model.png │ │ ├── demo_cantilever_3el_3d_T.png │ │ ├── ssi_portal_frame_1-defo.png │ │ ├── ssi_portal_frame_1-load.png │ │ ├── ssi_portal_frame_1-model.png │ │ ├── ssi_portal_frame_1-sxx.png │ │ ├── ssi_portal_frame_1-sxy.png │ │ ├── ssi_portal_frame_1-syy.png │ │ ├── ssi_portal_frame_1-vmis.png │ │ ├── demo_cantilever_3el_3d_My.png │ │ ├── demo_cantilever_3el_3d_Mz.png │ │ ├── demo_cantilever_3el_3d_Vy.png │ │ ├── demo_cantilever_3el_3d_Vz.png │ │ ├── demo_cantilever_3el_3d_defo.png │ │ ├── demo_cantilever_3el_3d_model.png │ │ ├── portal_frame-model_nodes_only.png │ │ ├── portal_frame-model_with_eles.png │ │ ├── portal_frame_loads_supports.png │ │ ├── demo_cantilever_3el_3d_extruded_members.png │ │ ├── demo_ssi_portal_frame_fiber_section-sxx.png │ │ ├── demo_ssi_portal_frame_fiber_section-sxy.png │ │ ├── demo_ssi_portal_frame_fiber_section-syy.png │ │ ├── demo_ssi_portal_frame_fiber_section-defo.png │ │ ├── demo_ssi_portal_frame_fiber_section-load.png │ │ ├── demo_ssi_portal_frame_fiber_section-model.png │ │ ├── demo_ssi_portal_frame_fiber_section-vmis.png │ │ ├── demo_ssi_portal_frame_fiber_section-fibsec.png │ │ └── demo_ssi_portal_frame_fiber_section-bending-moments.png │ │ ├── _sources │ │ ├── plot_load.rst.txt │ │ ├── plot_reactions.rst.txt │ │ ├── anim_defo.rst.txt │ │ ├── anim_mode.rst.txt │ │ ├── plot_loads_2d.rst.txt │ │ ├── plot_model.rst.txt │ │ ├── plot_mode_shape.rst.txt │ │ ├── plot_strain.rst.txt │ │ ├── plot_stress.rst.txt │ │ ├── plot_defo.rst.txt │ │ ├── plot_stress_2d.rst.txt │ │ ├── plot_supports_and_loads_2d.rst.txt │ │ ├── plot_fiber_section.rst.txt │ │ ├── fib_sec_list_to_cmds.rst.txt │ │ ├── section_force_diagram_2d.rst.txt │ │ ├── section_force_diagram_3d.rst.txt │ │ ├── sig_out_per_node.rst.txt │ │ ├── plot_extruded_model_rect_section_3d.rst.txt │ │ ├── examples.rst.txt │ │ ├── ex_plot_fiber_section.rst.txt │ │ ├── ex_quads_4x4.rst.txt │ │ ├── ex_2d_portal_frame.rst.txt │ │ ├── ex_3d_3el_cantilever.rst.txt │ │ ├── ex_2d_ssi_portal_frame.rst.txt │ │ ├── ex_2d_portal_frame_th_mode_anim.rst.txt │ │ └── index.rst.txt │ │ ├── .buildinfo │ │ ├── .buildinfo.bak │ │ ├── _downloads │ │ ├── b4e13c93b3aad1683aeceabe653e552c │ │ │ └── demo_portal_frame.py │ │ ├── 9675d24ef54c3e1f6a713f406ab9fb10 │ │ │ └── demo_ssi_portal_frame.py │ │ ├── 0fc02fe2faab11b3375742145454f2b4 │ │ │ └── demo_plot_fiber_section.py │ │ ├── 2c1f4d53d5bbfbe430c02fbc90f15d0b │ │ │ └── demo_quads_4x4.py │ │ ├── 4ae8a52b585d7ed65d7d5205344390a0 │ │ │ └── demo_cantilever_3el_3d.py │ │ ├── 456a20c71721eaaff171c97a90110f6d │ │ │ └── demo_ssi_portal_frame_fiber_section.py │ │ └── 504b3e5c092f22d4d8708d2d1aa94b7d │ │ │ └── demo_portal_frame_time_history_anim.py │ │ ├── genindex.html │ │ ├── _modules │ │ └── index.html │ │ ├── search.html │ │ ├── plot_supports_and_loads_2d.html │ │ ├── examples.html │ │ ├── plot_loads_2d.html │ │ ├── fib_sec_list_to_cmds.html │ │ └── plot_reactions.html ├── src │ ├── img │ │ ├── fibsec_rc.png │ │ ├── fibsec_circ.png │ │ ├── quads_4x4_s1.png │ │ ├── quads_4x4_s2.png │ │ ├── fibsec_wshape.png │ │ ├── portal_frame-M.png │ │ ├── portal_frame-N.png │ │ ├── portal_frame-V.png │ │ ├── quads_4x4_alfa.png │ │ ├── quads_4x4_defo.png │ │ ├── quads_4x4_exx.png │ │ ├── quads_4x4_exy.png │ │ ├── quads_4x4_eyy.png │ │ ├── quads_4x4_model.png │ │ ├── quads_4x4_sxx.png │ │ ├── quads_4x4_sxy.png │ │ ├── quads_4x4_syy.png │ │ ├── quads_4x4_vmis.png │ │ ├── truss_ex1_defo.png │ │ ├── portal_frame-defo.png │ │ ├── portal_frame-loads.png │ │ ├── demo_cantilever_3el_3d_My.png │ │ ├── demo_cantilever_3el_3d_Mz.png │ │ ├── demo_cantilever_3el_3d_N.png │ │ ├── demo_cantilever_3el_3d_T.png │ │ ├── demo_cantilever_3el_3d_Vy.png │ │ ├── demo_cantilever_3el_3d_Vz.png │ │ ├── demo_cantilever_3el_3d_defo.png │ │ ├── quads_4x4_vmis_ips_nds_vals.png │ │ ├── demo_cantilever_3el_3d_model.png │ │ ├── portal_frame-model_nodes_only.png │ │ ├── portal_frame-model_with_eles.png │ │ ├── demo_cantilever_3el_3d_extruded_members.png │ │ ├── demo_ssi_portal_frame_fiber_section-defo.png │ │ ├── demo_ssi_portal_frame_fiber_section-load.png │ │ ├── demo_ssi_portal_frame_fiber_section-sxx.png │ │ ├── demo_ssi_portal_frame_fiber_section-sxy.png │ │ ├── demo_ssi_portal_frame_fiber_section-syy.png │ │ ├── demo_ssi_portal_frame_fiber_section-vmis.png │ │ ├── demo_ssi_portal_frame_fiber_section-fibsec.png │ │ ├── demo_ssi_portal_frame_fiber_section-model.png │ │ └── demo_ssi_portal_frame_fiber_section-bending-moments.png │ ├── examples │ │ ├── brick_test_1_tris_pyevt.vtu │ │ ├── brick20n_eps_el1.xml │ │ ├── brick20n_ip_el1.xml │ │ ├── demo_portal_frame.py │ │ ├── demo_ssi_portal_frame.py │ │ ├── demo_plot_fiber_section.py │ │ ├── demo_quads_4x4.py │ │ ├── demo_cantilever_3el_3d.py │ │ ├── demo_ssi_portal_frame_fiber_section.py │ │ └── demo_portal_frame_time_history_anim.py │ ├── plot_load.rst │ ├── plot_reactions.rst │ ├── anim_defo.rst │ ├── anim_mode.rst │ ├── requirements.txt │ ├── plot_model.rst │ ├── plot_mode_shape.rst │ ├── plot_strain.rst │ ├── plot_stress.rst │ ├── plot_defo.rst │ ├── plot_stress_2d.rst │ ├── plot_fiber_section.rst │ ├── fib_sec_list_to_cmds.rst │ ├── section_force_diagram_2d.rst │ ├── section_force_diagram_3d.rst │ ├── sig_out_per_node.rst │ ├── plot_extruded_model_rect_section_3d.rst │ ├── examples.rst │ ├── ex_plot_fiber_section.rst │ ├── ex_quads_4x4.rst │ ├── ex_2d_portal_frame.rst │ ├── ex_3d_3el_cantilever.rst │ ├── ex_2d_ssi_portal_frame.rst │ ├── ex_2d_portal_frame_th_mode_anim.rst │ ├── conf.py │ └── index.rst ├── Makefile └── make.bat ├── pyproject.toml ├── opsvis ├── __init__.py └── settings.py ├── README.md ├── setup.cfg ├── .github └── workflows │ └── publish-to-test-pypi.yml ├── .readthedocs.yaml └── .gitignore /requirements.txt: -------------------------------------------------------------------------------- 1 | openseespy 2 | numpy 3 | matplotlib 4 | -------------------------------------------------------------------------------- /doc/build/html/_static/custom.css: -------------------------------------------------------------------------------- 1 | /* This file intentionally left blank. */ 2 | -------------------------------------------------------------------------------- /doc/build/html/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/objects.inv -------------------------------------------------------------------------------- /doc/src/img/fibsec_rc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/fibsec_rc.png -------------------------------------------------------------------------------- /doc/src/img/fibsec_circ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/fibsec_circ.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_s1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_s1.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_s2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_s2.png -------------------------------------------------------------------------------- /doc/build/html/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/file.png -------------------------------------------------------------------------------- /doc/build/html/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/plus.png -------------------------------------------------------------------------------- /doc/src/img/fibsec_wshape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/fibsec_wshape.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-M.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-N.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-N.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-V.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-V.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_alfa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_alfa.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_defo.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_exx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_exx.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_exy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_exy.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_eyy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_eyy.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_model.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_sxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_sxx.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_sxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_sxy.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_syy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_syy.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_vmis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_vmis.png -------------------------------------------------------------------------------- /doc/src/img/truss_ex1_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/truss_ex1_defo.png -------------------------------------------------------------------------------- /doc/build/html/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/minus.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/fibsec_rc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/fibsec_rc.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-loads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-loads.png -------------------------------------------------------------------------------- /doc/build/html/_images/fibsec_circ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/fibsec_circ.png -------------------------------------------------------------------------------- /doc/build/html/_images/fibsec_wshape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/fibsec_wshape.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-M.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-N.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-N.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-V.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-V.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_M.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_M.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_N.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_N.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_V.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_V.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_sxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_sxx.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_sxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_sxy.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_syy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_syy.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_vmis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_vmis.png -------------------------------------------------------------------------------- /doc/build/html/_images/truss_ex1_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/truss_ex1_defo.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_My.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_My.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_Mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_Mz.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_N.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_N.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_T.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_T.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_Vy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_Vy.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_Vz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_Vz.png -------------------------------------------------------------------------------- /doc/build/html/_images/quads_4x4_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/quads_4x4_model.png -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Bold.ttf -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_defo.png -------------------------------------------------------------------------------- /doc/src/img/quads_4x4_vmis_ips_nds_vals.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/quads_4x4_vmis_ips_nds_vals.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-loads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-loads.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_model.png -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Bold.woff2 -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Italic.ttf -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Italic.woff2 -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /doc/src/examples/brick_test_1_tris_pyevt.vtu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/examples/brick_test_1_tris_pyevt.vtu -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_model.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-model_nodes_only.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-model_nodes_only.png -------------------------------------------------------------------------------- /doc/src/img/portal_frame-model_with_eles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/portal_frame-model_with_eles.png -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = [ 3 | "setuptools>=42", 4 | "wheel" 5 | ] 6 | build-backend = "setuptools.build_meta" 7 | -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-BoldItalic.ttf -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-Regular.woff2 -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_T.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_T.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-load.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-model.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-sxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-sxx.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-sxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-sxy.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-syy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-syy.png -------------------------------------------------------------------------------- /doc/build/html/_images/ssi_portal_frame_1-vmis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/ssi_portal_frame_1-vmis.png -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/Lato-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/Lato-BoldItalic.woff2 -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/RobotoSlab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/RobotoSlab-Bold.woff2 -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_My.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_My.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_Mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_Mz.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_Vy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_Vy.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_Vz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_Vz.png -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/RobotoSlab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/RobotoSlab-Regular.woff2 -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_model.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-model_nodes_only.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-model_nodes_only.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame-model_with_eles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame-model_with_eles.png -------------------------------------------------------------------------------- /doc/build/html/_images/portal_frame_loads_supports.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/portal_frame_loads_supports.png -------------------------------------------------------------------------------- /doc/build/html/_static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /doc/build/html/_static/forkme_right_darkblue_121621.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_static/forkme_right_darkblue_121621.png -------------------------------------------------------------------------------- /doc/src/img/demo_cantilever_3el_3d_extruded_members.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_cantilever_3el_3d_extruded_members.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-defo.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-load.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-sxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-sxx.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-sxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-sxy.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-syy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-syy.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-vmis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-vmis.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-fibsec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-fibsec.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-model.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_cantilever_3el_3d_extruded_members.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_cantilever_3el_3d_extruded_members.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-sxx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-sxx.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-sxy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-sxy.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-syy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-syy.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-defo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-defo.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-load.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-model.png -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-vmis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-vmis.png -------------------------------------------------------------------------------- /doc/src/img/demo_ssi_portal_frame_fiber_section-bending-moments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/src/img/demo_ssi_portal_frame_fiber_section-bending-moments.png -------------------------------------------------------------------------------- /doc/src/plot_load.rst: -------------------------------------------------------------------------------- 1 | 2 | ========== 3 | plot_load 4 | ========== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_load 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-fibsec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-fibsec.png -------------------------------------------------------------------------------- /doc/src/plot_reactions.rst: -------------------------------------------------------------------------------- 1 | 2 | ========== 3 | plot_reactions 4 | ========== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_reactions 10 | :noindex: 11 | -------------------------------------------------------------------------------- /opsvis/__init__.py: -------------------------------------------------------------------------------- 1 | from .settings import * 2 | from .model import * 3 | from .defo import * 4 | from .anim import * 5 | from .secforces import * 6 | from .stress import * 7 | from .fibsec import * 8 | -------------------------------------------------------------------------------- /doc/build/html/_images/demo_ssi_portal_frame_fiber_section-bending-moments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sewkokot/opsvis/HEAD/doc/build/html/_images/demo_ssi_portal_frame_fiber_section-bending-moments.png -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_load.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ========== 3 | plot_load 4 | ========== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_load 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/anim_defo.rst: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | anim_defo 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: anim_defo 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/anim_mode.rst: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | anim_mode 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: anim_mode 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/requirements.txt: -------------------------------------------------------------------------------- 1 | # Defining the exact version will make sure things don't break 2 | openseespy 3 | opsvis 4 | numpy 5 | matplotlib 6 | sphinx 7 | sphinx_rtd_theme 8 | readthedocs-sphinx-search 9 | -------------------------------------------------------------------------------- /doc/src/plot_model.rst: -------------------------------------------------------------------------------- 1 | 2 | ===================== 3 | plot_model 4 | ===================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_model 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_reactions.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ========== 3 | plot_reactions 4 | ========== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_reactions 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/anim_defo.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | anim_defo 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: anim_defo 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/anim_mode.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | anim_mode 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: anim_mode 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_loads_2d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ============== 3 | plot_loads_2d 4 | ============== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_loads_2d 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_model.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ===================== 3 | plot_model 4 | ===================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_model 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/plot_mode_shape.rst: -------------------------------------------------------------------------------- 1 | 2 | ========================== 3 | plot_mode_shape 4 | ========================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_mode_shape 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/plot_strain.rst: -------------------------------------------------------------------------------- 1 | 2 | ============ 3 | plot_strain 4 | ============ 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_strain 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/src/plot_stress.rst: -------------------------------------------------------------------------------- 1 | 2 | ============ 3 | plot_stress 4 | ============ 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_stress 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/src/plot_defo.rst: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | plot_defo 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_defo 10 | :noindex: 11 | 12 | .. image:: /img/truss_ex1_defo.png 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_mode_shape.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ========================== 3 | plot_mode_shape 4 | ========================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_mode_shape 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_strain.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ============ 3 | plot_strain 4 | ============ 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_strain 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_stress.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ============ 3 | plot_stress 4 | ============ 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_stress 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/build/html/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 88b5b8f0fd1a1cf4568bd72db23886ed 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_defo.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ==================== 3 | plot_defo 4 | ==================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_defo 10 | :noindex: 11 | 12 | .. image:: /img/truss_ex1_defo.png 13 | -------------------------------------------------------------------------------- /doc/src/plot_stress_2d.rst: -------------------------------------------------------------------------------- 1 | 2 | ========================= 3 | plot_stress_2d 4 | ========================= 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_stress_2d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/build/html/.buildinfo.bak: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 64cee8c902f32dddd269fb2cd7f16adb 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_stress_2d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ========================= 3 | plot_stress_2d 4 | ========================= 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_stress_2d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex3` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_supports_and_loads_2d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | =========================== 3 | plot_supports_and_loads_2d 4 | =========================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_supports_and_loads_2d 10 | :noindex: 11 | -------------------------------------------------------------------------------- /doc/src/plot_fiber_section.rst: -------------------------------------------------------------------------------- 1 | 2 | ============================= 3 | plot_fiber_section 4 | ============================= 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_fiber_section 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex4` 13 | -------------------------------------------------------------------------------- /doc/src/fib_sec_list_to_cmds.rst: -------------------------------------------------------------------------------- 1 | 2 | =============================== 3 | fib_sec_list_to_cmds 4 | =============================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: fib_sec_list_to_cmds 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex4` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_fiber_section.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ============================= 3 | plot_fiber_section 4 | ============================= 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_fiber_section 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex4` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/fib_sec_list_to_cmds.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | =============================== 3 | fib_sec_list_to_cmds 4 | =============================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: fib_sec_list_to_cmds 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex4` 13 | -------------------------------------------------------------------------------- /doc/src/section_force_diagram_2d.rst: -------------------------------------------------------------------------------- 1 | 2 | =================================== 3 | section_force_diagram_2d 4 | =================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: section_force_diagram_2d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex1` 13 | -------------------------------------------------------------------------------- /doc/src/section_force_diagram_3d.rst: -------------------------------------------------------------------------------- 1 | 2 | =================================== 3 | section_force_diagram_3d 4 | =================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: section_force_diagram_3d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex2` 13 | -------------------------------------------------------------------------------- /doc/src/sig_out_per_node.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_sig_out_per_node: 3 | 4 | ================================ 5 | sig_out_per_node 6 | ================================ 7 | 8 | .. automodule:: opsvis 9 | :noindex: 10 | 11 | .. autofunction:: sig_out_per_node 12 | :noindex: 13 | 14 | See example :ref:`opsvis_ex3` 15 | -------------------------------------------------------------------------------- /doc/build/html/_sources/section_force_diagram_2d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | =================================== 3 | section_force_diagram_2d 4 | =================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: section_force_diagram_2d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex1` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/section_force_diagram_3d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | =================================== 3 | section_force_diagram_3d 4 | =================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: section_force_diagram_3d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex2` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/sig_out_per_node.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_sig_out_per_node: 3 | 4 | ================================ 5 | sig_out_per_node 6 | ================================ 7 | 8 | .. automodule:: opsvis 9 | :noindex: 10 | 11 | .. autofunction:: sig_out_per_node 12 | :noindex: 13 | 14 | See example :ref:`opsvis_ex3` 15 | -------------------------------------------------------------------------------- /doc/src/plot_extruded_model_rect_section_3d.rst: -------------------------------------------------------------------------------- 1 | 2 | ============================================== 3 | plot_extruded_model_rect_section_3d 4 | ============================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_extruded_shapes_3d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex2` 13 | -------------------------------------------------------------------------------- /doc/build/html/_sources/plot_extruded_model_rect_section_3d.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | ============================================== 3 | plot_extruded_model_rect_section_3d 4 | ============================================== 5 | 6 | .. automodule:: opsvis 7 | :noindex: 8 | 9 | .. autofunction:: plot_extruded_shapes_3d 10 | :noindex: 11 | 12 | See example :ref:`opsvis_ex2` 13 | -------------------------------------------------------------------------------- /doc/build/html/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | const DOCUMENTATION_OPTIONS = { 2 | VERSION: '1.3.3', 3 | LANGUAGE: 'en', 4 | COLLAPSE_INDEX: false, 5 | BUILDER: 'html', 6 | FILE_SUFFIX: '.html', 7 | LINK_SUFFIX: '.html', 8 | HAS_SOURCE: true, 9 | SOURCELINK_SUFFIX: '.txt', 10 | NAVIGATION_WITH_KEYS: false, 11 | SHOW_SEARCH_SUMMARY: true, 12 | ENABLE_SEARCH_SHORTCUTS: true, 13 | }; -------------------------------------------------------------------------------- /doc/src/examples.rst: -------------------------------------------------------------------------------- 1 | ========== 2 | Examples 3 | ========== 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :hidden: 8 | 9 | ex_2d_portal_frame 10 | ex_3d_3el_cantilever 11 | ex_quads_4x4 12 | ex_plot_fiber_section 13 | ex_2d_portal_frame_th_mode_anim 14 | ex_2d_ssi_portal_frame 15 | 16 | #. :doc:`ex_2d_portal_frame` 17 | #. :doc:`ex_3d_3el_cantilever` 18 | #. :doc:`ex_quads_4x4` 19 | #. :doc:`ex_plot_fiber_section` 20 | #. :doc:`ex_2d_portal_frame_th_mode_anim` 21 | #. :doc:`ex_2d_ssi_portal_frame` 22 | -------------------------------------------------------------------------------- /doc/src/ex_plot_fiber_section.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex4: 3 | 4 | ====================================================== 5 | Plot steel and reinforced concrete fiber sections 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/fibsec_rc.png 11 | .. image:: /img/fibsec_wshape.png 12 | .. image:: /img/fibsec_circ.png 13 | 14 | .. literalinclude:: examples/demo_plot_fiber_section.py 15 | :linenos: 16 | -------------------------------------------------------------------------------- /doc/build/html/_sources/examples.rst.txt: -------------------------------------------------------------------------------- 1 | ========== 2 | Examples 3 | ========== 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :hidden: 8 | 9 | ex_2d_portal_frame 10 | ex_3d_3el_cantilever 11 | ex_quads_4x4 12 | ex_plot_fiber_section 13 | ex_2d_portal_frame_th_mode_anim 14 | ex_2d_ssi_portal_frame 15 | 16 | #. :doc:`ex_2d_portal_frame` 17 | #. :doc:`ex_3d_3el_cantilever` 18 | #. :doc:`ex_quads_4x4` 19 | #. :doc:`ex_plot_fiber_section` 20 | #. :doc:`ex_2d_portal_frame_th_mode_anim` 21 | #. :doc:`ex_2d_ssi_portal_frame` 22 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_plot_fiber_section.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex4: 3 | 4 | ====================================================== 5 | Plot steel and reinforced concrete fiber sections 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/fibsec_rc.png 11 | .. image:: /img/fibsec_wshape.png 12 | .. image:: /img/fibsec_circ.png 13 | 14 | .. literalinclude:: examples/demo_plot_fiber_section.py 15 | :linenos: 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # opsvis 2 | 3 | OpenSeesPy (OpenSees) postprocessing and visualization module 4 | 5 | ## Installation 6 | 7 | `pip install opsvis` 8 | 9 | Note: The previous name of this module was `ops_vis`, but to avoid 10 | issues with PyPi and readthedocs naming conventions, the name of the 11 | package and module to import is without the underscore. 12 | 13 | ## Usage 14 | 15 | `import opsvis as opsv` 16 | 17 | ## Documentation 18 | 19 | https://opsvis.readthedocs.io/en/latest/ 20 | 21 | ## OpenSeesPy documentation 22 | 23 | https://openseespydoc.readthedocs.io/en/latest/ 24 | -------------------------------------------------------------------------------- /doc/src/examples/brick20n_eps_el1.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /doc/src/examples/brick20n_ip_el1.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /doc/src/ex_quads_4x4.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex3: 3 | 4 | ====================================================== 5 | Plot stress distribution of a plane stress quad model 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/quads_4x4_model.png 11 | .. image:: /img/quads_4x4_defo.png 12 | .. image:: /img/quads_4x4_sxx.png 13 | .. image:: /img/quads_4x4_syy.png 14 | .. image:: /img/quads_4x4_sxy.png 15 | .. image:: /img/quads_4x4_vmis.png 16 | 17 | .. literalinclude:: /examples/demo_quads_4x4.py 18 | :linenos: 19 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_quads_4x4.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex3: 3 | 4 | ====================================================== 5 | Plot stress distribution of a plane stress quad model 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/quads_4x4_model.png 11 | .. image:: /img/quads_4x4_defo.png 12 | .. image:: /img/quads_4x4_sxx.png 13 | .. image:: /img/quads_4x4_syy.png 14 | .. image:: /img/quads_4x4_sxy.png 15 | .. image:: /img/quads_4x4_vmis.png 16 | 17 | .. literalinclude:: /examples/demo_quads_4x4.py 18 | :linenos: 19 | -------------------------------------------------------------------------------- /doc/src/ex_2d_portal_frame.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex1: 3 | 4 | ============================================== 5 | 2d Portal Frame 6 | ============================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/portal_frame-model_nodes_only.png 11 | .. image:: /img/portal_frame-model_with_eles.png 12 | .. image:: /img/portal_frame-loads.png 13 | .. image:: /img/portal_frame-defo.png 14 | .. image:: /img/portal_frame-N.png 15 | .. image:: /img/portal_frame-V.png 16 | .. image:: /img/portal_frame-M.png 17 | 18 | .. literalinclude:: /examples/demo_portal_frame.py 19 | :linenos: 20 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_2d_portal_frame.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex1: 3 | 4 | ============================================== 5 | 2d Portal Frame 6 | ============================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/portal_frame-model_nodes_only.png 11 | .. image:: /img/portal_frame-model_with_eles.png 12 | .. image:: /img/portal_frame-loads.png 13 | .. image:: /img/portal_frame-defo.png 14 | .. image:: /img/portal_frame-N.png 15 | .. image:: /img/portal_frame-V.png 16 | .. image:: /img/portal_frame-M.png 17 | 18 | .. literalinclude:: /examples/demo_portal_frame.py 19 | :linenos: 20 | -------------------------------------------------------------------------------- /doc/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = src 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = opsvis 3 | version = 1.3.4 4 | author = Seweryn Kokot 5 | author_email = sewkokot@gmail.com 6 | description = OpenSeesPy (OpenSees) Python postprocessing and visualization module 7 | long_description = file: README.md 8 | long_description_content_type = text/markdown 9 | url = https://github.com/sewkokot/opsvis 10 | project_urls = 11 | Bug Tracker = https://github.com/sewkokot/opsvis/issues 12 | classifiers = 13 | Programming Language :: Python :: 3 14 | License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) 15 | Operating System :: OS Independent 16 | 17 | [options] 18 | packages = find: 19 | install_requires = 20 | openseespy 21 | python_requires = >=3.6 22 | setup_requires = 23 | setuptools>=42 24 | wheel 25 | -------------------------------------------------------------------------------- /doc/src/ex_3d_3el_cantilever.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex2: 3 | 4 | ====================================================== 5 | Statics of a 3d 3-element cantilever beam 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/demo_cantilever_3el_3d_model.png 11 | .. image:: /img/demo_cantilever_3el_3d_extruded_members.png 12 | .. image:: /img/demo_cantilever_3el_3d_defo.png 13 | .. image:: /img/demo_cantilever_3el_3d_Mz.png 14 | .. image:: /img/demo_cantilever_3el_3d_My.png 15 | .. image:: /img/demo_cantilever_3el_3d_Vz.png 16 | .. image:: /img/demo_cantilever_3el_3d_Vy.png 17 | .. image:: /img/demo_cantilever_3el_3d_T.png 18 | 19 | .. literalinclude:: /examples/demo_cantilever_3el_3d.py 20 | :linenos: 21 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_3d_3el_cantilever.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex2: 3 | 4 | ====================================================== 5 | Statics of a 3d 3-element cantilever beam 6 | ====================================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/demo_cantilever_3el_3d_model.png 11 | .. image:: /img/demo_cantilever_3el_3d_extruded_members.png 12 | .. image:: /img/demo_cantilever_3el_3d_defo.png 13 | .. image:: /img/demo_cantilever_3el_3d_Mz.png 14 | .. image:: /img/demo_cantilever_3el_3d_My.png 15 | .. image:: /img/demo_cantilever_3el_3d_Vz.png 16 | .. image:: /img/demo_cantilever_3el_3d_Vy.png 17 | .. image:: /img/demo_cantilever_3el_3d_T.png 18 | 19 | .. literalinclude:: /examples/demo_cantilever_3el_3d.py 20 | :linenos: 21 | -------------------------------------------------------------------------------- /doc/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=src 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /.github/workflows/publish-to-test-pypi.yml: -------------------------------------------------------------------------------- 1 | name: Publish Python distributions to PyPI 2 | 3 | on: push 4 | 5 | jobs: 6 | build-n-publish: 7 | name: Build and publish Python distributions to PyPI 8 | runs-on: ubuntu-18.04 9 | 10 | steps: 11 | - uses: actions/checkout@master 12 | - name: Set up Python 3.9 13 | uses: actions/setup-python@v1 14 | with: 15 | python-version: 3.9 16 | 17 | - name: Install pypa/build 18 | run: >- 19 | python -m 20 | pip install 21 | build 22 | --user 23 | - name: Build a binary wheel and a source tarball 24 | run: >- 25 | python -m 26 | build 27 | --sdist 28 | --wheel 29 | --outdir dist/ 30 | . 31 | 32 | - name: Publish package 33 | if: startsWith(github.ref, 'refs/tags') 34 | uses: pypa/gh-action-pypi-publish@master 35 | with: 36 | password: ${{ secrets.PYPI_API_TOKEN }} 37 | -------------------------------------------------------------------------------- /doc/src/ex_2d_ssi_portal_frame.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex6: 3 | 4 | ============================================== 5 | Soil-structure interaction: 2d Portal Frame 6 | ============================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/demo_ssi_portal_frame_fiber_section-model.png 11 | .. image:: /img/demo_ssi_portal_frame_fiber_section-fibsec.png 12 | .. image:: /img/demo_ssi_portal_frame_fiber_section-load.png 13 | .. image:: /img/demo_ssi_portal_frame_fiber_section-defo.png 14 | .. image:: /img/demo_ssi_portal_frame_fiber_section-sxx.png 15 | .. image:: /img/demo_ssi_portal_frame_fiber_section-syy.png 16 | .. image:: /img/demo_ssi_portal_frame_fiber_section-sxy.png 17 | .. image:: /img/demo_ssi_portal_frame_fiber_section-vmis.png 18 | .. image:: /img/demo_ssi_portal_frame_fiber_section-bending-moments.png 19 | 20 | .. literalinclude:: /examples/demo_ssi_portal_frame_fiber_section.py 21 | :linenos: 22 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_2d_ssi_portal_frame.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _opsvis_ex6: 3 | 4 | ============================================== 5 | Soil-structure interaction: 2d Portal Frame 6 | ============================================== 7 | 8 | Example ``.py`` file can be downloaded :download:`here `: 9 | 10 | .. image:: /img/demo_ssi_portal_frame_fiber_section-model.png 11 | .. image:: /img/demo_ssi_portal_frame_fiber_section-fibsec.png 12 | .. image:: /img/demo_ssi_portal_frame_fiber_section-load.png 13 | .. image:: /img/demo_ssi_portal_frame_fiber_section-defo.png 14 | .. image:: /img/demo_ssi_portal_frame_fiber_section-sxx.png 15 | .. image:: /img/demo_ssi_portal_frame_fiber_section-syy.png 16 | .. image:: /img/demo_ssi_portal_frame_fiber_section-sxy.png 17 | .. image:: /img/demo_ssi_portal_frame_fiber_section-vmis.png 18 | .. image:: /img/demo_ssi_portal_frame_fiber_section-bending-moments.png 19 | 20 | .. literalinclude:: /examples/demo_ssi_portal_frame_fiber_section.py 21 | :linenos: 22 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | os: ubuntu-20.04 5 | tools: 6 | python: "3.12" 7 | commands: 8 | - mkdir --parents _readthedocs/html/ 9 | - cp --recursive doc/build/html/* _readthedocs/html/ 10 | 11 | # Read the Docs configuration file for Sphinx projects 12 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 13 | 14 | # Required 15 | # version: 2 16 | 17 | # Set the OS, Python version and other tools you might need 18 | # build: 19 | # os: ubuntu-22.04 20 | # tools: 21 | # python: "3.12" 22 | # # You can also specify other tool versions: 23 | # # nodejs: "20" 24 | # # rust: "1.70" 25 | # # golang: "1.20" 26 | 27 | # Build documentation in the "docs/" directory with Sphinx 28 | # sphinx: 29 | # configuration: doc/src/conf.py 30 | # # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs 31 | # # builder: "dirhtml" 32 | # # Fail on all warnings to avoid broken references 33 | # # fail_on_warning: true 34 | 35 | # Optionally build your docs in additional formats such as PDF and ePub 36 | # formats: 37 | # - pdf 38 | # - epub 39 | 40 | # Optional but recommended, declare the Python requirements required 41 | # to build your documentation 42 | # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html 43 | # python: 44 | # install: 45 | # - requirements: doc/src/requirements.txt 46 | -------------------------------------------------------------------------------- /doc/src/ex_2d_portal_frame_th_mode_anim.rst: -------------------------------------------------------------------------------- 1 | .. _opsvis_ex5: 2 | 3 | ============================================================================= 4 | Animation of dynamic analysis and mode shapes of a 2d Portal Frame 5 | ============================================================================= 6 | 7 | Example ``.py`` file can be downloaded :download:`here `: 8 | 9 | If you do not see the animation running, depending on Python 10 | environment, you will have to set a matplotlib backand which supports 11 | animation. 12 | 13 | For example to see the matplotlib animations in the Spyder Python 14 | editor (which should be installed with the Anaconda platform), in the 15 | IPython console run ``%matplotlib qt``. Then comment/uncomment one of 16 | the two animations. 17 | 18 | 19 | .. raw:: html 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | .. literalinclude:: /examples/demo_portal_frame_time_history_anim.py 28 | :linenos: 29 | -------------------------------------------------------------------------------- /doc/build/html/_sources/ex_2d_portal_frame_th_mode_anim.rst.txt: -------------------------------------------------------------------------------- 1 | .. _opsvis_ex5: 2 | 3 | ============================================================================= 4 | Animation of dynamic analysis and mode shapes of a 2d Portal Frame 5 | ============================================================================= 6 | 7 | Example ``.py`` file can be downloaded :download:`here `: 8 | 9 | If you do not see the animation running, depending on Python 10 | environment, you will have to set a matplotlib backand which supports 11 | animation. 12 | 13 | For example to see the matplotlib animations in the Spyder Python 14 | editor (which should be installed with the Anaconda platform), in the 15 | IPython console run ``%matplotlib qt``. Then comment/uncomment one of 16 | the two animations. 17 | 18 | 19 | .. raw:: html 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | .. literalinclude:: /examples/demo_portal_frame_time_history_anim.py 28 | :linenos: 29 | -------------------------------------------------------------------------------- /doc/src/examples/demo_portal_frame.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | ops.model('basic', '-ndm', 2, '-ndf', 3) 8 | 9 | colL, girL = 4., 6. 10 | 11 | Acol, Agir = 2.e-3, 6.e-3 12 | IzCol, IzGir = 1.6e-5, 5.4e-5 13 | 14 | E = 200.e9 15 | 16 | Ep = {1: [E, Acol, IzCol], 17 | 2: [E, Acol, IzCol], 18 | 3: [E, Agir, IzGir]} 19 | 20 | ops.node(1, 0., 0.) 21 | ops.node(2, 0., colL) 22 | ops.node(3, girL, 0.) 23 | ops.node(4, girL, colL) 24 | 25 | ops.fix(1, 1, 1, 1) 26 | ops.fix(3, 1, 1, 0) 27 | 28 | opsv.plot_model() 29 | plt.title('plot_model before defining elements') 30 | 31 | ops.geomTransf('Linear', 1) 32 | 33 | # columns 34 | ops.element('elasticBeamColumn', 1, 1, 2, Acol, E, IzCol, 1) 35 | ops.element('elasticBeamColumn', 2, 3, 4, Acol, E, IzCol, 1) 36 | # girder 37 | ops.element('elasticBeamColumn', 3, 2, 4, Agir, E, IzGir, 1) 38 | 39 | Px = 2.e+3 40 | Wy = -10.e+3 41 | Wx = 0. 42 | 43 | Ew = {3: ['-beamUniform', Wy, Wx]} 44 | 45 | ops.timeSeries('Constant', 1) 46 | ops.pattern('Plain', 1, 1) 47 | ops.load(2, Px, 0., 0.) 48 | 49 | for etag in Ew: 50 | ops.eleLoad('-ele', etag, '-type', Ew[etag][0], Ew[etag][1], 51 | Ew[etag][2]) 52 | 53 | ops.constraints('Transformation') 54 | ops.numberer('RCM') 55 | ops.system('BandGeneral') 56 | ops.test('NormDispIncr', 1.0e-6, 6, 2) 57 | ops.algorithm('Linear') 58 | ops.integrator('LoadControl', 1) 59 | ops.analysis('Static') 60 | ops.analyze(1) 61 | 62 | ops.printModel() 63 | 64 | opsv.plot_model() 65 | plt.title('plot_model after defining elements') 66 | 67 | opsv.plot_load() 68 | 69 | opsv.plot_reactions() 70 | 71 | # sfac = 80. 72 | 73 | opsv.plot_defo() 74 | # opsv.plot_defo(sfac) 75 | # fmt_interp = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '.', 'markersize': 6} 76 | # opsv.plot_defo(sfac, fmt_interp=fmt_interp) 77 | 78 | # 4. plot N, V, M forces diagrams 79 | 80 | sfacN, sfacV, sfacM = 5.e-5, 5.e-5, 5.e-5 81 | 82 | opsv.section_force_diagram_2d('N', sfacN) 83 | plt.title('Axial force distribution') 84 | 85 | opsv.section_force_diagram_2d('T', sfacV) 86 | plt.title('Shear force distribution') 87 | 88 | opsv.section_force_diagram_2d('M', sfacM) 89 | plt.title('Bending moment distribution') 90 | 91 | plt.show() 92 | 93 | exit() 94 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/b4e13c93b3aad1683aeceabe653e552c/demo_portal_frame.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | ops.model('basic', '-ndm', 2, '-ndf', 3) 8 | 9 | colL, girL = 4., 6. 10 | 11 | Acol, Agir = 2.e-3, 6.e-3 12 | IzCol, IzGir = 1.6e-5, 5.4e-5 13 | 14 | E = 200.e9 15 | 16 | Ep = {1: [E, Acol, IzCol], 17 | 2: [E, Acol, IzCol], 18 | 3: [E, Agir, IzGir]} 19 | 20 | ops.node(1, 0., 0.) 21 | ops.node(2, 0., colL) 22 | ops.node(3, girL, 0.) 23 | ops.node(4, girL, colL) 24 | 25 | ops.fix(1, 1, 1, 1) 26 | ops.fix(3, 1, 1, 0) 27 | 28 | opsv.plot_model() 29 | plt.title('plot_model before defining elements') 30 | 31 | ops.geomTransf('Linear', 1) 32 | 33 | # columns 34 | ops.element('elasticBeamColumn', 1, 1, 2, Acol, E, IzCol, 1) 35 | ops.element('elasticBeamColumn', 2, 3, 4, Acol, E, IzCol, 1) 36 | # girder 37 | ops.element('elasticBeamColumn', 3, 2, 4, Agir, E, IzGir, 1) 38 | 39 | Px = 2.e+3 40 | Wy = -10.e+3 41 | Wx = 0. 42 | 43 | Ew = {3: ['-beamUniform', Wy, Wx]} 44 | 45 | ops.timeSeries('Constant', 1) 46 | ops.pattern('Plain', 1, 1) 47 | ops.load(2, Px, 0., 0.) 48 | 49 | for etag in Ew: 50 | ops.eleLoad('-ele', etag, '-type', Ew[etag][0], Ew[etag][1], 51 | Ew[etag][2]) 52 | 53 | ops.constraints('Transformation') 54 | ops.numberer('RCM') 55 | ops.system('BandGeneral') 56 | ops.test('NormDispIncr', 1.0e-6, 6, 2) 57 | ops.algorithm('Linear') 58 | ops.integrator('LoadControl', 1) 59 | ops.analysis('Static') 60 | ops.analyze(1) 61 | 62 | ops.printModel() 63 | 64 | opsv.plot_model() 65 | plt.title('plot_model after defining elements') 66 | 67 | opsv.plot_load() 68 | 69 | opsv.plot_reactions() 70 | 71 | # sfac = 80. 72 | 73 | opsv.plot_defo() 74 | # opsv.plot_defo(sfac) 75 | # fmt_interp = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '.', 'markersize': 6} 76 | # opsv.plot_defo(sfac, fmt_interp=fmt_interp) 77 | 78 | # 4. plot N, V, M forces diagrams 79 | 80 | sfacN, sfacV, sfacM = 5.e-5, 5.e-5, 5.e-5 81 | 82 | opsv.section_force_diagram_2d('N', sfacN) 83 | plt.title('Axial force distribution') 84 | 85 | opsv.section_force_diagram_2d('T', sfacV) 86 | plt.title('Shear force distribution') 87 | 88 | opsv.section_force_diagram_2d('M', sfacM) 89 | plt.title('Bending moment distribution') 90 | 91 | plt.show() 92 | 93 | exit() 94 | -------------------------------------------------------------------------------- /doc/src/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | import os 14 | import sys 15 | 16 | sys.path.insert(0, os.path.abspath('../../')) 17 | # -- Project information ----------------------------------------------------- 18 | 19 | project = 'opsvis' 20 | copyright = '2025, Seweryn Kokot' 21 | author = 'Seweryn Kokot' 22 | 23 | # The full version, including alpha/beta/rc tags 24 | release = '1.3.3' 25 | 26 | # -- General configuration --------------------------------------------------- 27 | 28 | # Add any Sphinx extension module names here, as strings. They can be 29 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 30 | # ones. 31 | extensions = [ 32 | 'sphinx.ext.autodoc', 33 | 'sphinx.ext.napoleon', 34 | 'sphinx.ext.viewcode' 35 | ] 36 | 37 | napoleon_google_docstring = True 38 | 39 | # 'autoapi.extension' 40 | # autoapi_dirs = ['./opsvis'] 41 | 42 | # autosummary_generate = True 43 | 44 | # The master toctree document. 45 | master_doc = 'index' 46 | 47 | # Add any paths that contain templates here, relative to this directory. 48 | # templates_path = ['_templates'] 49 | 50 | # List of patterns, relative to source directory, that match files and 51 | # directories to ignore when looking for source files. 52 | # This pattern also affects html_static_path and html_extra_path. 53 | exclude_patterns = [] 54 | 55 | # -- Options for HTML output ------------------------------------------------- 56 | 57 | # The theme to use for HTML and HTML Help pages. See the documentation for 58 | # a list of builtin themes. 59 | # 60 | # html_theme = 'alabaster' 61 | html_theme = 'sphinx_rtd_theme' 62 | 63 | # Add any paths that contain custom static files (such as style sheets) here, 64 | # relative to this directory. They are copied after the builtin static files, 65 | # so a file named "default.css" will overwrite the builtin "default.css". 66 | # html_static_path = ['_static'] 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | develop-eggs/ 12 | dist/ 13 | doctrees/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /doc/src/examples/demo_ssi_portal_frame.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | import matplotlib.pyplot as plt 4 | 5 | ops.model('basic', '-ndm', 2, '-ndf', 2) 6 | 7 | Ls, Hs = 10, 4 8 | nx, ny = Ls, Hs 9 | 10 | ops.nDMaterial('ElasticIsotropic', 1, 1000., .3) 11 | 12 | ops.block2D(nx, ny, 1, 1, 'quad', 1, 'PlaneStress', 1, 13 | 1, 0., 0., 14 | 2, Ls, 0., 15 | 3, Ls, Hs, 16 | 4, 0., Hs) 17 | 18 | ops.fixY(0., 1, 1) 19 | ops.fixX(0., 1, 0) 20 | ops.fixX(Ls, 1, 0) 21 | 22 | ops.model('basic', '-ndm', 2, '-ndf', 3) 23 | 24 | ops.node(100, 2., 4.) 25 | ops.node(101, 2., 8.) 26 | ops.node(102, 1., 4.) 27 | ops.node(103, 3., 4.) 28 | ops.node(110, 8., 4.) 29 | ops.node(111, 8., 8.) 30 | ops.node(112, 7., 4.) 31 | ops.node(113, 9., 4.) 32 | 33 | ops.equalDOF(46, 102, 1, 2) 34 | ops.equalDOF(47, 100, 1, 2) 35 | ops.equalDOF(48, 103, 1, 2) 36 | ops.equalDOF(52, 112, 1, 2) 37 | ops.equalDOF(53, 110, 1, 2) 38 | ops.equalDOF(54, 113, 1, 2) 39 | 40 | b, h = .3, .2 41 | A, Iz = b*h, b*h**3./12. 42 | E = 25.e6 43 | 44 | ops.geomTransf('Linear', 1) 45 | ops.element('elasticBeamColumn', 101, 100, 101, A, E, Iz, 1) 46 | ops.element('elasticBeamColumn', 103, 102, 100, A, E, Iz, 1) 47 | ops.element('elasticBeamColumn', 104, 100, 103, A, E, Iz, 1) 48 | 49 | ops.element('elasticBeamColumn', 111, 110, 111, A, E, Iz, 1) 50 | ops.element('elasticBeamColumn', 113, 112, 110, A, E, Iz, 1) 51 | ops.element('elasticBeamColumn', 114, 110, 113, A, E, Iz, 1) 52 | 53 | ops.element('elasticBeamColumn', 121, 101, 111, A, E, Iz, 1) 54 | 55 | Px, Py, Wy = 10., 1., -3. 56 | 57 | ops.timeSeries('Linear', 1) 58 | ops.pattern('Plain', 1, 1) 59 | ops.load(101, Px, -Py, 0.) 60 | 61 | ops.eleLoad('-ele', 121, '-type', '-beamUniform', Wy) 62 | 63 | ops.algorithm('Linear') 64 | ops.analysis('Static') 65 | ops.analyze(1) 66 | 67 | opsv.plot_model() 68 | opsv.plot_load() 69 | 70 | opsv.plot_defo(node_supports=0) 71 | plt.title('opsv.plot_defo(node_supports=0)') 72 | 73 | sfac = 20. 74 | 75 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 76 | opsv.plot_stress('sxx', sfac=sfac, ax=ax) 77 | plt.title('Stress sxx') 78 | 79 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 80 | opsv.plot_stress('syy', sfac=sfac, ax=ax) 81 | plt.title('Stress syy') 82 | 83 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 84 | opsv.plot_stress('sxy', sfac=sfac, ax=ax) 85 | plt.title('Stress sxy') 86 | 87 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 88 | opsv.plot_stress('vmis', sfac=sfac, ax=ax) 89 | plt.title('Stress vmis') 90 | 91 | plt.show() 92 | 93 | exit() 94 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/9675d24ef54c3e1f6a713f406ab9fb10/demo_ssi_portal_frame.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | import matplotlib.pyplot as plt 4 | 5 | ops.model('basic', '-ndm', 2, '-ndf', 2) 6 | 7 | Ls, Hs = 10, 4 8 | nx, ny = Ls, Hs 9 | 10 | ops.nDMaterial('ElasticIsotropic', 1, 1000., .3) 11 | 12 | ops.block2D(nx, ny, 1, 1, 'quad', 1, 'PlaneStress', 1, 13 | 1, 0., 0., 14 | 2, Ls, 0., 15 | 3, Ls, Hs, 16 | 4, 0., Hs) 17 | 18 | ops.fixY(0., 1, 1) 19 | ops.fixX(0., 1, 0) 20 | ops.fixX(Ls, 1, 0) 21 | 22 | ops.model('basic', '-ndm', 2, '-ndf', 3) 23 | 24 | ops.node(100, 2., 4.) 25 | ops.node(101, 2., 8.) 26 | ops.node(102, 1., 4.) 27 | ops.node(103, 3., 4.) 28 | ops.node(110, 8., 4.) 29 | ops.node(111, 8., 8.) 30 | ops.node(112, 7., 4.) 31 | ops.node(113, 9., 4.) 32 | 33 | ops.equalDOF(46, 102, 1, 2) 34 | ops.equalDOF(47, 100, 1, 2) 35 | ops.equalDOF(48, 103, 1, 2) 36 | ops.equalDOF(52, 112, 1, 2) 37 | ops.equalDOF(53, 110, 1, 2) 38 | ops.equalDOF(54, 113, 1, 2) 39 | 40 | b, h = .3, .2 41 | A, Iz = b*h, b*h**3./12. 42 | E = 25.e6 43 | 44 | ops.geomTransf('Linear', 1) 45 | ops.element('elasticBeamColumn', 101, 100, 101, A, E, Iz, 1) 46 | ops.element('elasticBeamColumn', 103, 102, 100, A, E, Iz, 1) 47 | ops.element('elasticBeamColumn', 104, 100, 103, A, E, Iz, 1) 48 | 49 | ops.element('elasticBeamColumn', 111, 110, 111, A, E, Iz, 1) 50 | ops.element('elasticBeamColumn', 113, 112, 110, A, E, Iz, 1) 51 | ops.element('elasticBeamColumn', 114, 110, 113, A, E, Iz, 1) 52 | 53 | ops.element('elasticBeamColumn', 121, 101, 111, A, E, Iz, 1) 54 | 55 | Px, Py, Wy = 10., 1., -3. 56 | 57 | ops.timeSeries('Linear', 1) 58 | ops.pattern('Plain', 1, 1) 59 | ops.load(101, Px, -Py, 0.) 60 | 61 | ops.eleLoad('-ele', 121, '-type', '-beamUniform', Wy) 62 | 63 | ops.algorithm('Linear') 64 | ops.analysis('Static') 65 | ops.analyze(1) 66 | 67 | opsv.plot_model() 68 | opsv.plot_load() 69 | 70 | opsv.plot_defo(node_supports=0) 71 | plt.title('opsv.plot_defo(node_supports=0)') 72 | 73 | sfac = 20. 74 | 75 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 76 | opsv.plot_stress('sxx', sfac=sfac, ax=ax) 77 | plt.title('Stress sxx') 78 | 79 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 80 | opsv.plot_stress('syy', sfac=sfac, ax=ax) 81 | plt.title('Stress syy') 82 | 83 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 84 | opsv.plot_stress('sxy', sfac=sfac, ax=ax) 85 | plt.title('Stress sxy') 86 | 87 | sfac, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 88 | opsv.plot_stress('vmis', sfac=sfac, ax=ax) 89 | plt.title('Stress vmis') 90 | 91 | plt.show() 92 | 93 | exit() 94 | -------------------------------------------------------------------------------- /doc/build/html/_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:normal;src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2") format("woff2"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60}.rst-versions .rst-current-version::after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:bold}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge .fa-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} 2 | -------------------------------------------------------------------------------- /doc/src/examples/demo_plot_fiber_section.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | # import opensees as ops # local compilation 3 | import opsvis as opsv 4 | 5 | import matplotlib.pyplot as plt 6 | 7 | ops.wipe() 8 | ops.model('basic', '-ndm', 2, '-ndf', 3) # frame 2D 9 | 10 | # 1. rotated steel shape 11 | 12 | fib_sec_1 = [['section', 'Fiber', 1, '-GJ', 1.0e6], 13 | ['patch', 'quad', 1, 4, 1, 0.032, 0.317, -0.311, 0.067, -0.266, 0.005, 0.077, 0.254], 14 | ['patch', 'quad', 1, 1, 4, -0.075, 0.144, -0.114, 0.116, 0.075, -0.144, 0.114, -0.116], 15 | ['patch', 'quad', 1, 4, 1, 0.266, -0.005, -0.077, -0.254, -0.032, -0.317, 0.311, -0.067] 16 | ] 17 | 18 | # fib_sec_1 list can be used both for plotting and OpenSees commands defining 19 | # the actual fiber section in the OpenSees domain. Normally you would have to 20 | # use regular section('Fiber', ...), fiber(), layer(), patch() commands with 21 | # the same data to define the fiber section. However do not use both 22 | # ways in the same model. 23 | 24 | # opsv.fib_sec_list_to_cmds(fib_sec_1) 25 | 26 | # 2. RC section 27 | 28 | Bcol = 0.711 29 | Hcol = Bcol 30 | 31 | c = 0.076 # cover 32 | 33 | y1col = Hcol/2.0 34 | z1col = Bcol/2.0 35 | 36 | y2col = 0.5*(Hcol-2*c)/3.0 37 | 38 | nFibZ = 1 39 | nFib = 20 40 | nFibCover, nFibCore = 2, 16 41 | As9 = 0.0006446 42 | 43 | fib_sec_2 = [['section', 'Fiber', 3, '-GJ', 1.0e6], 44 | ['patch', 'rect', 2, nFibCore, nFibZ, c-y1col, c-z1col, y1col-c, z1col-c], 45 | ['patch', 'rect', 3, nFib, nFibZ, -y1col, -z1col, y1col, c-z1col], 46 | ['patch', 'rect', 3, nFib, nFibZ, -y1col, z1col-c, y1col, z1col], 47 | ['patch', 'rect', 3, nFibCover, nFibZ, -y1col, c-z1col, c-y1col, z1col-c], 48 | ['patch', 'rect', 3, nFibCover, nFibZ, y1col-c, c-z1col, y1col, z1col-c], 49 | ['layer', 'straight', 4, 4, As9, y1col-c, z1col-c, y1col-c, c-z1col], 50 | ['layer', 'straight', 4, 2, As9, y2col, z1col-c, y2col, c-z1col], 51 | ['layer', 'straight', 4, 2, As9, -y2col, z1col-c, -y2col, c-z1col], 52 | ['layer', 'straight', 4, 4, As9, c-y1col, z1col-c, c-y1col, c-z1col]] 53 | 54 | 55 | # opsv.fib_sec_list_to_cmds(fib_sec_2) 56 | 57 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 58 | opsv.plot_fiber_section(fib_sec_1, matcolor=matcolor) 59 | plt.axis('equal') 60 | # plt.savefig('fibsec_wshape.png') 61 | 62 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 63 | opsv.plot_fiber_section(fib_sec_2, matcolor=matcolor) 64 | plt.axis('equal') 65 | # plt.savefig('fibsec_rc.png') 66 | 67 | # 3. circular cross-section 68 | nc1, nr1 = 8, 3 69 | nc2, nr2 = 8, 2 70 | ri1, re1 = 0.1, 0.2 71 | ri2, re2 = 0.2, 0.25 72 | a_beg, a_end = 0., 360. 73 | rbar3 = 0.225 74 | a_beg2, a_end2 = 0., 360. 75 | 76 | fib_sec_3 = [['section', 'Fiber', 1, '-GJ', 1.0e6], 77 | ['patch', 'circ', 2, nc1, nr1, 0., 0., ri1, re1, a_beg, a_end], 78 | ['patch', 'circ', 3, nc2, nr2, 0., 0., ri2, re2, a_beg, a_end], 79 | ['layer', 'circ', 4, 6, As9, 0., 0., rbar3, a_beg2, a_end2], 80 | ] 81 | 82 | 83 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 84 | opsv.plot_fiber_section(fib_sec_3, matcolor=matcolor) 85 | plt.axis('equal') 86 | # plt.savefig('fibsec_circ.png') 87 | 88 | plt.show() 89 | -------------------------------------------------------------------------------- /doc/src/index.rst: -------------------------------------------------------------------------------- 1 | .. opsvis documentation master file, created by 2 | sphinx-quickstart on Sat Aug 22 13:35:16 2020. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to Opsvis documentation! 7 | ================================ 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | plot_model 14 | plot_defo 15 | plot_load 16 | plot_reactions 17 | plot_mode_shape 18 | section_force_diagram_2d 19 | section_force_diagram_3d 20 | plot_stress 21 | plot_strain 22 | plot_stress_2d 23 | plot_extruded_model_rect_section_3d 24 | anim_defo 25 | anim_mode 26 | plot_fiber_section 27 | fib_sec_list_to_cmds 28 | sig_out_per_node 29 | examples 30 | 31 | Opsvis is a postprocessing and visualization module for OpenSeesPy, 32 | developed by Seweryn Kokot from Opole University of Technology, 33 | Poland. 34 | 35 | For OpenSeesPy documentation, visit: 36 | `OpenSeesPy documentation `_ 37 | 38 | Key Features of Opsvis: 39 | 40 | - Orientation of frame members in 3D space, 41 | - Interpolated deformations of frame structures (as static images or 42 | animations), 43 | - Section force distributions, 44 | - Stress visualization for triangular and quadrilateral 2D elements 45 | (4-, 8-, and 9-node), including Huber-Mieses-Hencky equivalent stress, 46 | principal stresses. 47 | - Visualization of cross-section fibers, 48 | - Animations of time-history deformations and mode shapes. 49 | 50 | These capabilities help lower the barrier to entry for teaching and 51 | learning OpenSees in civil engineering education. Additionally, Opsvis 52 | provides visualization features that can support advanced research 53 | applications. 54 | 55 | 56 | Installation 57 | ============ 58 | 59 | ``pip install opsvis`` 60 | 61 | 62 | Usage 63 | ===== 64 | 65 | To use Opsvis in your OpenSeesPy scripts, begin your ``.py`` file with the 66 | following import: :: 67 | 68 | import openseespy.opensees as ops 69 | import opsvis as opsv 70 | import matplotlib.pyplot as plt 71 | 72 | # ... your OpenSeesPy model and analysis commands ... 73 | opsv.plot_model() 74 | opsv.plot_load() 75 | opsv.plot_reactions() 76 | sfac = opsv.plot_defo() 77 | 78 | 79 | Commands 80 | ======== 81 | 82 | The main commands for visualizing various aspects of an OpenSees 83 | model are as follows: 84 | 85 | #. :doc:`plot_model` 86 | #. :doc:`plot_defo` 87 | #. :doc:`plot_load` 88 | #. :doc:`plot_mode_shape` 89 | #. :doc:`section_force_diagram_2d` 90 | #. :doc:`section_force_diagram_3d` 91 | #. :doc:`plot_stress` 92 | #. :doc:`plot_strain` 93 | #. :doc:`plot_stress_2d` 94 | #. :doc:`plot_extruded_model_rect_section_3d` 95 | #. :doc:`anim_defo` 96 | #. :doc:`anim_mode` 97 | #. :doc:`plot_fiber_section` 98 | 99 | You can also make use of the following helper functions: 100 | 101 | #. :doc:`fib_sec_list_to_cmds` 102 | #. :doc:`sig_out_per_node` 103 | 104 | Check out the :doc:`examples` page for usage demonstrations. 105 | 106 | Notes: 107 | ====== 108 | 109 | * ``plot_fiber_section`` is inspired by Matlab ``plotSection.zip`` 110 | written by D. Vamvatsikos available at 111 | http://users.ntua.gr/divamva/software.html 112 | -------------------------------------------------------------------------------- /doc/build/html/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | .. opsvis documentation master file, created by 2 | sphinx-quickstart on Sat Aug 22 13:35:16 2020. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to Opsvis documentation! 7 | ================================ 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | plot_model 14 | plot_defo 15 | plot_load 16 | plot_reactions 17 | plot_mode_shape 18 | section_force_diagram_2d 19 | section_force_diagram_3d 20 | plot_stress 21 | plot_strain 22 | plot_stress_2d 23 | plot_extruded_model_rect_section_3d 24 | anim_defo 25 | anim_mode 26 | plot_fiber_section 27 | fib_sec_list_to_cmds 28 | sig_out_per_node 29 | examples 30 | 31 | Opsvis is a postprocessing and visualization module for OpenSeesPy, 32 | developed by Seweryn Kokot from Opole University of Technology, 33 | Poland. 34 | 35 | For OpenSeesPy documentation, visit: 36 | `OpenSeesPy documentation `_ 37 | 38 | Key Features of Opsvis: 39 | 40 | - Orientation of frame members in 3D space, 41 | - Interpolated deformations of frame structures (as static images or 42 | animations), 43 | - Section force distributions, 44 | - Stress visualization for triangular and quadrilateral 2D elements 45 | (4-, 8-, and 9-node), including Huber-Mieses-Hencky equivalent stress, 46 | principal stresses. 47 | - Visualization of cross-section fibers, 48 | - Animations of time-history deformations and mode shapes. 49 | 50 | These capabilities help lower the barrier to entry for teaching and 51 | learning OpenSees in civil engineering education. Additionally, Opsvis 52 | provides visualization features that can support advanced research 53 | applications. 54 | 55 | 56 | Installation 57 | ============ 58 | 59 | ``pip install opsvis`` 60 | 61 | 62 | Usage 63 | ===== 64 | 65 | To use Opsvis in your OpenSeesPy scripts, begin your ``.py`` file with the 66 | following import: :: 67 | 68 | import openseespy.opensees as ops 69 | import opsvis as opsv 70 | import matplotlib.pyplot as plt 71 | 72 | # ... your OpenSeesPy model and analysis commands ... 73 | opsv.plot_model() 74 | opsv.plot_load() 75 | opsv.plot_reactions() 76 | sfac = opsv.plot_defo() 77 | 78 | 79 | Commands 80 | ======== 81 | 82 | The main commands for visualizing various aspects of an OpenSees 83 | model are as follows: 84 | 85 | #. :doc:`plot_model` 86 | #. :doc:`plot_defo` 87 | #. :doc:`plot_load` 88 | #. :doc:`plot_mode_shape` 89 | #. :doc:`section_force_diagram_2d` 90 | #. :doc:`section_force_diagram_3d` 91 | #. :doc:`plot_stress` 92 | #. :doc:`plot_strain` 93 | #. :doc:`plot_stress_2d` 94 | #. :doc:`plot_extruded_model_rect_section_3d` 95 | #. :doc:`anim_defo` 96 | #. :doc:`anim_mode` 97 | #. :doc:`plot_fiber_section` 98 | 99 | You can also make use of the following helper functions: 100 | 101 | #. :doc:`fib_sec_list_to_cmds` 102 | #. :doc:`sig_out_per_node` 103 | 104 | Check out the :doc:`examples` page for usage demonstrations. 105 | 106 | Notes: 107 | ====== 108 | 109 | * ``plot_fiber_section`` is inspired by Matlab ``plotSection.zip`` 110 | written by D. Vamvatsikos available at 111 | http://users.ntua.gr/divamva/software.html 112 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/0fc02fe2faab11b3375742145454f2b4/demo_plot_fiber_section.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | # import opensees as ops # local compilation 3 | import opsvis as opsv 4 | 5 | import matplotlib.pyplot as plt 6 | 7 | ops.wipe() 8 | ops.model('basic', '-ndm', 2, '-ndf', 3) # frame 2D 9 | 10 | # 1. rotated steel shape 11 | 12 | fib_sec_1 = [['section', 'Fiber', 1, '-GJ', 1.0e6], 13 | ['patch', 'quad', 1, 4, 1, 0.032, 0.317, -0.311, 0.067, -0.266, 0.005, 0.077, 0.254], 14 | ['patch', 'quad', 1, 1, 4, -0.075, 0.144, -0.114, 0.116, 0.075, -0.144, 0.114, -0.116], 15 | ['patch', 'quad', 1, 4, 1, 0.266, -0.005, -0.077, -0.254, -0.032, -0.317, 0.311, -0.067] 16 | ] 17 | 18 | # fib_sec_1 list can be used both for plotting and OpenSees commands defining 19 | # the actual fiber section in the OpenSees domain. Normally you would have to 20 | # use regular section('Fiber', ...), fiber(), layer(), patch() commands with 21 | # the same data to define the fiber section. However do not use both 22 | # ways in the same model. 23 | 24 | # opsv.fib_sec_list_to_cmds(fib_sec_1) 25 | 26 | # 2. RC section 27 | 28 | Bcol = 0.711 29 | Hcol = Bcol 30 | 31 | c = 0.076 # cover 32 | 33 | y1col = Hcol/2.0 34 | z1col = Bcol/2.0 35 | 36 | y2col = 0.5*(Hcol-2*c)/3.0 37 | 38 | nFibZ = 1 39 | nFib = 20 40 | nFibCover, nFibCore = 2, 16 41 | As9 = 0.0006446 42 | 43 | fib_sec_2 = [['section', 'Fiber', 3, '-GJ', 1.0e6], 44 | ['patch', 'rect', 2, nFibCore, nFibZ, c-y1col, c-z1col, y1col-c, z1col-c], 45 | ['patch', 'rect', 3, nFib, nFibZ, -y1col, -z1col, y1col, c-z1col], 46 | ['patch', 'rect', 3, nFib, nFibZ, -y1col, z1col-c, y1col, z1col], 47 | ['patch', 'rect', 3, nFibCover, nFibZ, -y1col, c-z1col, c-y1col, z1col-c], 48 | ['patch', 'rect', 3, nFibCover, nFibZ, y1col-c, c-z1col, y1col, z1col-c], 49 | ['layer', 'straight', 4, 4, As9, y1col-c, z1col-c, y1col-c, c-z1col], 50 | ['layer', 'straight', 4, 2, As9, y2col, z1col-c, y2col, c-z1col], 51 | ['layer', 'straight', 4, 2, As9, -y2col, z1col-c, -y2col, c-z1col], 52 | ['layer', 'straight', 4, 4, As9, c-y1col, z1col-c, c-y1col, c-z1col]] 53 | 54 | 55 | # opsv.fib_sec_list_to_cmds(fib_sec_2) 56 | 57 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 58 | opsv.plot_fiber_section(fib_sec_1, matcolor=matcolor) 59 | plt.axis('equal') 60 | # plt.savefig('fibsec_wshape.png') 61 | 62 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 63 | opsv.plot_fiber_section(fib_sec_2, matcolor=matcolor) 64 | plt.axis('equal') 65 | # plt.savefig('fibsec_rc.png') 66 | 67 | # 3. circular cross-section 68 | nc1, nr1 = 8, 3 69 | nc2, nr2 = 8, 2 70 | ri1, re1 = 0.1, 0.2 71 | ri2, re2 = 0.2, 0.25 72 | a_beg, a_end = 0., 360. 73 | rbar3 = 0.225 74 | a_beg2, a_end2 = 0., 360. 75 | 76 | fib_sec_3 = [['section', 'Fiber', 1, '-GJ', 1.0e6], 77 | ['patch', 'circ', 2, nc1, nr1, 0., 0., ri1, re1, a_beg, a_end], 78 | ['patch', 'circ', 3, nc2, nr2, 0., 0., ri2, re2, a_beg, a_end], 79 | ['layer', 'circ', 4, 6, As9, 0., 0., rbar3, a_beg2, a_end2], 80 | ] 81 | 82 | 83 | matcolor = ['r', 'lightgrey', 'gold', 'w', 'w', 'w'] 84 | opsv.plot_fiber_section(fib_sec_3, matcolor=matcolor) 85 | plt.axis('equal') 86 | # plt.savefig('fibsec_circ.png') 87 | 88 | plt.show() 89 | -------------------------------------------------------------------------------- /doc/src/examples/demo_quads_4x4.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | ops.model('basic', '-ndm', 2, '-ndf', 2) 8 | ops.node(1, 0., 0.) 9 | ops.node(2, 0., 1.) 10 | ops.node(3, 0., 2.) 11 | ops.node(4, 0., 3.) 12 | ops.node(5, 0., 4.) 13 | ops.node(6, 1., 0.) 14 | ops.node(7, 1., 1.) 15 | ops.node(8, 1., 2.) 16 | ops.node(9, 1., 3.) 17 | ops.node(10, 1., 4.) 18 | ops.node(11, 2., 0.) 19 | ops.node(12, 2., 1.) 20 | ops.node(13, 2., 2.) 21 | ops.node(14, 2., 3.) 22 | ops.node(15, 2., 4.) 23 | ops.node(16, 3., 0.) 24 | ops.node(17, 3., 1.) 25 | ops.node(18, 3., 2.) 26 | ops.node(19, 3., 3.) 27 | ops.node(20, 3., 4.) 28 | ops.node(21, 4., 0.) 29 | ops.node(22, 4., 1.) 30 | ops.node(23, 4., 2.) 31 | ops.node(24, 4., 3.) 32 | ops.node(25, 4., 4.) 33 | 34 | ops.nDMaterial('ElasticIsotropic', 1, 1000, 0.3) 35 | 36 | ops.element('quad', 1, 1, 6, 7, 2, 1, 'PlaneStress', 1) 37 | ops.element('quad', 2, 2, 7, 8, 3, 1, 'PlaneStress', 1) 38 | ops.element('quad', 3, 3, 8, 9, 4, 1, 'PlaneStress', 1) 39 | ops.element('quad', 4, 4, 9, 10, 5, 1, 'PlaneStress', 1) 40 | ops.element('quad', 5, 6, 11, 12, 7, 1, 'PlaneStress', 1) 41 | ops.element('quad', 6, 7, 12, 13, 8, 1, 'PlaneStress', 1) 42 | ops.element('quad', 7, 8, 13, 14, 9, 1, 'PlaneStress', 1) 43 | ops.element('quad', 8, 9, 14, 15, 10, 1, 'PlaneStress', 1) 44 | ops.element('quad', 9, 11, 16, 17, 12, 1, 'PlaneStress', 1) 45 | ops.element('quad', 10, 12, 17, 18, 13, 1, 'PlaneStress', 1) 46 | ops.element('quad', 11, 13, 18, 19, 14, 1, 'PlaneStress', 1) 47 | ops.element('quad', 12, 14, 19, 20, 15, 1, 'PlaneStress', 1) 48 | ops.element('quad', 13, 16, 21, 22, 17, 1, 'PlaneStress', 1) 49 | ops.element('quad', 14, 17, 22, 23, 18, 1, 'PlaneStress', 1) 50 | ops.element('quad', 15, 18, 23, 24, 19, 1, 'PlaneStress', 1) 51 | ops.element('quad', 16, 19, 24, 25, 20, 1, 'PlaneStress', 1) 52 | 53 | ops.fix(1, 1, 1) 54 | ops.fix(6, 1, 1) 55 | ops.fix(11, 1, 1) 56 | ops.fix(16, 1, 1) 57 | ops.fix(21, 1, 1) 58 | 59 | ops.equalDOF(2, 22, 1, 2) 60 | ops.equalDOF(3, 23, 1, 2) 61 | ops.equalDOF(4, 24, 1, 2) 62 | ops.equalDOF(5, 25, 1, 2) 63 | 64 | ops.timeSeries('Linear', 1) 65 | ops.pattern('Plain', 1, 1) 66 | ops.load(15, 0., -1.) 67 | 68 | ops.analysis('Static') 69 | ops.analyze(1) 70 | 71 | # - plot model 72 | opsv.plot_model() 73 | plt.axis('equal') 74 | 75 | # plt.figure() 76 | opsv.plot_load() 77 | 78 | # - plot deformation 79 | opsv.plot_defo(unDefoFlag=1) 80 | plt.axis('equal') 81 | 82 | jstr = 'sxx' 83 | plt.figure() 84 | opsv.plot_stress(jstr) 85 | plt.xlabel('x [m]') 86 | plt.ylabel('y [m]') 87 | plt.title(f'{jstr}') 88 | 89 | jstr = 'syy' 90 | plt.figure() 91 | opsv.plot_stress(jstr) 92 | plt.xlabel('x [m]') 93 | plt.ylabel('y [m]') 94 | plt.title(f'{jstr}') 95 | 96 | jstr = 'sxy' 97 | plt.figure() 98 | opsv.plot_stress(jstr) 99 | plt.xlabel('x [m]') 100 | plt.ylabel('y [m]') 101 | plt.title(f'{jstr}') 102 | 103 | jstr = 'vmis' 104 | plt.figure() 105 | opsv.plot_stress(jstr) 106 | plt.xlabel('x [m]') 107 | plt.ylabel('y [m]') 108 | plt.title(f'{jstr}') 109 | 110 | 111 | jstr = 'exx' 112 | plt.figure() 113 | opsv.plot_strain(jstr) 114 | plt.xlabel('x [m]') 115 | plt.ylabel('y [m]') 116 | plt.title(f'{jstr}') 117 | 118 | jstr = 'eyy' 119 | plt.figure() 120 | opsv.plot_strain(jstr) 121 | plt.xlabel('x [m]') 122 | plt.ylabel('y [m]') 123 | plt.title(f'{jstr}') 124 | 125 | jstr = 'exy' 126 | plt.figure() 127 | opsv.plot_strain(jstr) 128 | plt.xlabel('x [m]') 129 | plt.ylabel('y [m]') 130 | plt.title(f'{jstr}') 131 | 132 | plt.show() 133 | 134 | exit() 135 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/2c1f4d53d5bbfbe430c02fbc90f15d0b/demo_quads_4x4.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | ops.model('basic', '-ndm', 2, '-ndf', 2) 8 | ops.node(1, 0., 0.) 9 | ops.node(2, 0., 1.) 10 | ops.node(3, 0., 2.) 11 | ops.node(4, 0., 3.) 12 | ops.node(5, 0., 4.) 13 | ops.node(6, 1., 0.) 14 | ops.node(7, 1., 1.) 15 | ops.node(8, 1., 2.) 16 | ops.node(9, 1., 3.) 17 | ops.node(10, 1., 4.) 18 | ops.node(11, 2., 0.) 19 | ops.node(12, 2., 1.) 20 | ops.node(13, 2., 2.) 21 | ops.node(14, 2., 3.) 22 | ops.node(15, 2., 4.) 23 | ops.node(16, 3., 0.) 24 | ops.node(17, 3., 1.) 25 | ops.node(18, 3., 2.) 26 | ops.node(19, 3., 3.) 27 | ops.node(20, 3., 4.) 28 | ops.node(21, 4., 0.) 29 | ops.node(22, 4., 1.) 30 | ops.node(23, 4., 2.) 31 | ops.node(24, 4., 3.) 32 | ops.node(25, 4., 4.) 33 | 34 | ops.nDMaterial('ElasticIsotropic', 1, 1000, 0.3) 35 | 36 | ops.element('quad', 1, 1, 6, 7, 2, 1, 'PlaneStress', 1) 37 | ops.element('quad', 2, 2, 7, 8, 3, 1, 'PlaneStress', 1) 38 | ops.element('quad', 3, 3, 8, 9, 4, 1, 'PlaneStress', 1) 39 | ops.element('quad', 4, 4, 9, 10, 5, 1, 'PlaneStress', 1) 40 | ops.element('quad', 5, 6, 11, 12, 7, 1, 'PlaneStress', 1) 41 | ops.element('quad', 6, 7, 12, 13, 8, 1, 'PlaneStress', 1) 42 | ops.element('quad', 7, 8, 13, 14, 9, 1, 'PlaneStress', 1) 43 | ops.element('quad', 8, 9, 14, 15, 10, 1, 'PlaneStress', 1) 44 | ops.element('quad', 9, 11, 16, 17, 12, 1, 'PlaneStress', 1) 45 | ops.element('quad', 10, 12, 17, 18, 13, 1, 'PlaneStress', 1) 46 | ops.element('quad', 11, 13, 18, 19, 14, 1, 'PlaneStress', 1) 47 | ops.element('quad', 12, 14, 19, 20, 15, 1, 'PlaneStress', 1) 48 | ops.element('quad', 13, 16, 21, 22, 17, 1, 'PlaneStress', 1) 49 | ops.element('quad', 14, 17, 22, 23, 18, 1, 'PlaneStress', 1) 50 | ops.element('quad', 15, 18, 23, 24, 19, 1, 'PlaneStress', 1) 51 | ops.element('quad', 16, 19, 24, 25, 20, 1, 'PlaneStress', 1) 52 | 53 | ops.fix(1, 1, 1) 54 | ops.fix(6, 1, 1) 55 | ops.fix(11, 1, 1) 56 | ops.fix(16, 1, 1) 57 | ops.fix(21, 1, 1) 58 | 59 | ops.equalDOF(2, 22, 1, 2) 60 | ops.equalDOF(3, 23, 1, 2) 61 | ops.equalDOF(4, 24, 1, 2) 62 | ops.equalDOF(5, 25, 1, 2) 63 | 64 | ops.timeSeries('Linear', 1) 65 | ops.pattern('Plain', 1, 1) 66 | ops.load(15, 0., -1.) 67 | 68 | ops.analysis('Static') 69 | ops.analyze(1) 70 | 71 | # - plot model 72 | opsv.plot_model() 73 | plt.axis('equal') 74 | 75 | # plt.figure() 76 | opsv.plot_load() 77 | 78 | # - plot deformation 79 | opsv.plot_defo(unDefoFlag=1) 80 | plt.axis('equal') 81 | 82 | jstr = 'sxx' 83 | plt.figure() 84 | opsv.plot_stress(jstr) 85 | plt.xlabel('x [m]') 86 | plt.ylabel('y [m]') 87 | plt.title(f'{jstr}') 88 | 89 | jstr = 'syy' 90 | plt.figure() 91 | opsv.plot_stress(jstr) 92 | plt.xlabel('x [m]') 93 | plt.ylabel('y [m]') 94 | plt.title(f'{jstr}') 95 | 96 | jstr = 'sxy' 97 | plt.figure() 98 | opsv.plot_stress(jstr) 99 | plt.xlabel('x [m]') 100 | plt.ylabel('y [m]') 101 | plt.title(f'{jstr}') 102 | 103 | jstr = 'vmis' 104 | plt.figure() 105 | opsv.plot_stress(jstr) 106 | plt.xlabel('x [m]') 107 | plt.ylabel('y [m]') 108 | plt.title(f'{jstr}') 109 | 110 | 111 | jstr = 'exx' 112 | plt.figure() 113 | opsv.plot_strain(jstr) 114 | plt.xlabel('x [m]') 115 | plt.ylabel('y [m]') 116 | plt.title(f'{jstr}') 117 | 118 | jstr = 'eyy' 119 | plt.figure() 120 | opsv.plot_strain(jstr) 121 | plt.xlabel('x [m]') 122 | plt.ylabel('y [m]') 123 | plt.title(f'{jstr}') 124 | 125 | jstr = 'exy' 126 | plt.figure() 127 | opsv.plot_strain(jstr) 128 | plt.xlabel('x [m]') 129 | plt.ylabel('y [m]') 130 | plt.title(f'{jstr}') 131 | 132 | plt.show() 133 | 134 | exit() 135 | -------------------------------------------------------------------------------- /doc/src/examples/demo_cantilever_3el_3d.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | 8 | ops.model('basic', '-ndm', 3, '-ndf', 6) 9 | 10 | b = 0.2 11 | h = 0.4 12 | 13 | A, Iz, Iy, J = 0.04, 0.0010667, 0.0002667, 0.01172 14 | 15 | E = 25.0e6 16 | G = 9615384.6 17 | 18 | # Lx, Ly, Lz = 4., 3., 5. 19 | Lx, Ly, Lz = 4., 4., 4. 20 | 21 | ops.node(1, 0., 0., 0.) 22 | ops.node(2, 0., 0., Lz) 23 | ops.node(3, Lx, 0., Lz) 24 | ops.node(4, Lx, Ly, Lz) 25 | 26 | ops.fix(1, 1, 1, 1, 1, 1, 1) 27 | 28 | lmass = 200. 29 | 30 | ops.mass(2, lmass, lmass, lmass, 0.001, 0.001, 0.001) 31 | ops.mass(3, lmass, lmass, lmass, 0.001, 0.001, 0.001) 32 | ops.mass(4, lmass, lmass, lmass, 0.001, 0.001, 0.001) 33 | 34 | gTTagz = 1 35 | gTTagx = 2 36 | gTTagy = 3 37 | 38 | coordTransf = 'Linear' 39 | ops.geomTransf(coordTransf, gTTagz, 0., -1., 0.) 40 | ops.geomTransf(coordTransf, gTTagx, 0., -1., 0.) 41 | ops.geomTransf(coordTransf, gTTagy, 1., 0., 0.) 42 | 43 | ops.element('elasticBeamColumn', 1, 1, 2, A, E, G, J, Iy, Iz, gTTagz) 44 | ops.element('elasticBeamColumn', 2, 2, 3, A, E, G, J, Iy, Iz, gTTagx) 45 | ops.element('elasticBeamColumn', 3, 3, 4, A, E, G, J, Iy, Iz, gTTagy) 46 | 47 | Ew = {} 48 | 49 | Px = -4.e1 50 | Py = -2.5e1 51 | Pz = -3.e1 52 | 53 | ops.timeSeries('Constant', 1) 54 | ops.pattern('Plain', 1, 1) 55 | ops.load(4, Px, Py, Pz, 0., 0., 0.) 56 | 57 | ops.constraints('Transformation') 58 | ops.numberer('RCM') 59 | ops.system('BandGeneral') 60 | ops.test('NormDispIncr', 1.0e-6, 6, 2) 61 | ops.algorithm('Linear') 62 | ops.integrator('LoadControl', 1) 63 | ops.analysis('Static') 64 | ops.analyze(1) 65 | 66 | 67 | opsv.plot_model() 68 | 69 | sfac = 2.0e0 70 | 71 | # fig_wi_he = 22., 14. 72 | fig_wi_he = 30., 20. 73 | 74 | # - 1 75 | nep = 9 76 | opsv.plot_defo(sfac, nep, az_el=(-68., 39.), 77 | fig_wi_he=fig_wi_he, endDispFlag=0) 78 | 79 | plt.title('3d 3-element cantilever beam') 80 | 81 | # - 2 82 | opsv.plot_defo(sfac, 19, az_el=(6., 30.), fig_wi_he=fig_wi_he) 83 | 84 | plt.title('3d 3-element cantilever beam') 85 | 86 | # - 3 87 | nfreq = 6 88 | eigValues = ops.eigen(nfreq) 89 | 90 | modeNo = 6 91 | 92 | sfac = 2.0e1 93 | opsv.plot_mode_shape(modeNo, sfac, 19, az_el=(106., 46.), 94 | fig_wi_he=fig_wi_he) 95 | plt.title(f'Mode {modeNo}') 96 | 97 | sfacN = 1.e-2 98 | sfacVy = 5.e-2 99 | sfacVz = 1.e-2 100 | sfacMy = 1.e-2 101 | sfacMz = 1.e-2 102 | sfacT = 1.e-2 103 | 104 | # plt.figure() 105 | opsv.section_force_diagram_3d('N', sfacN) 106 | plt.title('Axial force N') 107 | 108 | opsv.section_force_diagram_3d('Vy', sfacVy) 109 | plt.title('Transverse force Vy') 110 | 111 | opsv.section_force_diagram_3d('Vz', sfacVz) 112 | plt.title('Transverse force Vz') 113 | 114 | opsv.section_force_diagram_3d('My', sfacMy) 115 | plt.title('Bending moments My') 116 | 117 | opsv.section_force_diagram_3d('Mz', sfacMz) 118 | plt.title('Bending moments Mz') 119 | 120 | opsv.section_force_diagram_3d('T', sfacT) 121 | plt.title('Torsional moment T') 122 | 123 | # just for demonstration, 124 | # the section data below does not match the data in OpenSees model above 125 | # For now it can be source of inconsistency because OpenSees has 126 | # not got functions to return section dimensions. 127 | # A workaround is to have own Python helper functions to reuse data 128 | # specified once 129 | ele_shapes = {1: ['circ', [h]], 130 | 2: ['rect', [b, h]], 131 | 3: ['I', [b, h, b/10., h/6.]]} 132 | opsv.plot_extruded_shapes_3d(ele_shapes, fig_wi_he=fig_wi_he) 133 | 134 | plt.show() 135 | 136 | exit() 137 | -------------------------------------------------------------------------------- /doc/src/examples/demo_ssi_portal_frame_fiber_section.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | import matplotlib.pyplot as plt 4 | 5 | ops.model('basic', '-ndm', 2, '-ndf', 2) 6 | 7 | Ls, Hs = 10, 4 8 | nx, ny = Ls, Hs 9 | E0, Ec, Es = 1000, 20.e6, 200.e6 10 | 11 | b, h = .2, .3 12 | A, Iz, As, c = b*h, b*h**3./12., 0.0002, 0.025 13 | y1, z1 = h/2., b/2. 14 | nFibZ, nFib = 1, 20 15 | 16 | sec_tag, nip, beam_integ_tag, transf_tag = 1, 5, 1, 1 17 | mat0_tag, mat1_tag, mat2_tag = 1, 2, 3 18 | 19 | ops.nDMaterial('ElasticIsotropic', mat0_tag, E0, .3) 20 | ops.uniaxialMaterial('Elastic', mat1_tag, Ec) 21 | ops.uniaxialMaterial('Elastic', mat2_tag, Es) 22 | 23 | ops.block2D(nx, ny, 1, 1, 'quad', mat0_tag, 'PlaneStress', 1, 24 | 1, 0., 0., 25 | 2, Ls, 0., 26 | 3, Ls, Hs, 27 | 4, 0., Hs) 28 | 29 | ops.fixY(0., 1, 1); ops.fixX(0., 1, 0); ops.fixX(Ls, 1, 0) 30 | 31 | ops.model('basic', '-ndm', 2, '-ndf', 3) 32 | 33 | ops.node(100, 2., 4.); ops.node(101, 2., 8.) 34 | ops.node(102, 1., 4.); ops.node(103, 3., 4.) 35 | ops.node(110, 8., 4.); ops.node(111, 8., 8.) 36 | ops.node(112, 7., 4.); ops.node(113, 9., 4.) 37 | 38 | ops.equalDOF(46, 102, 1, 2); ops.equalDOF(47, 100, 1, 2) 39 | ops.equalDOF(48, 103, 1, 2); ops.equalDOF(52, 112, 1, 2) 40 | ops.equalDOF(53, 110, 1, 2); ops.equalDOF(54, 113, 1, 2) 41 | 42 | fib_sec_1 = [['section', 'Fiber', sec_tag, '-GJ', 1.0e6], 43 | ['patch', 'rect', mat1_tag, nFib, nFibZ, -y1, -z1, y1, z1], 44 | ['layer', 'straight', mat2_tag, 3, As, y1-c, z1-c, y1-c, c-z1], 45 | ['layer', 'straight', mat2_tag, 3, As, c-y1, z1-c, c-y1, c-z1] 46 | ] 47 | 48 | matcolor = ['r', 'gold', 'w'] 49 | opsv.plot_fiber_section(fib_sec_1, matcolor=matcolor) 50 | plt.axis('equal') 51 | 52 | opsv.fib_sec_list_to_cmds(fib_sec_1) 53 | 54 | ops.beamIntegration('Lobatto', beam_integ_tag, sec_tag, nip) 55 | 56 | ops.geomTransf('Linear', transf_tag) 57 | ops.element('elasticBeamColumn', 101, 100, 101, A, Ec, Iz, 1) 58 | ops.element('elasticBeamColumn', 111, 110, 111, A, Ec, Iz, 1) 59 | 60 | ops.element('forceBeamColumn', 121, 101, 111, transf_tag, beam_integ_tag) 61 | 62 | ops.element('elasticBeamColumn', 103, 102, 100, A, Ec, Iz, transf_tag) 63 | ops.element('elasticBeamColumn', 104, 100, 103, A, Ec, Iz, transf_tag) 64 | 65 | ops.element('elasticBeamColumn', 113, 112, 110, A, Ec, Iz, transf_tag) 66 | ops.element('elasticBeamColumn', 114, 110, 113, A, Ec, Iz, transf_tag) 67 | 68 | Px, Py, Wy = 15., 2., -3. 69 | 70 | ops.timeSeries('Linear', 1) 71 | ops.pattern('Plain', 1, 1) 72 | ops.load(101, Px, -Py, 0.) 73 | 74 | ops.eleLoad('-ele', 121, '-type', '-beamUniform', Wy) 75 | 76 | ops.analysis('Static') 77 | ops.analyze(1) 78 | 79 | opsv.plot_model() 80 | opsv.plot_load() 81 | 82 | opsv.plot_defo(node_supports=0) 83 | plt.title('opsv.plot_defo(node_supports=0)') 84 | 85 | sfac = 20. 86 | 87 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 88 | opsv.plot_stress('sxx', sfac=sfac, ax=ax) 89 | plt.title('Stress sxx') 90 | 91 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 92 | opsv.plot_stress('syy', sfac=sfac, ax=ax) 93 | plt.title('Stress syy') 94 | 95 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 96 | opsv.plot_stress('sxy', sfac=sfac, ax=ax) 97 | plt.title('Stress sxy') 98 | 99 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 100 | opsv.plot_stress('vmis', sfac=sfac, ax=ax) 101 | plt.title('Stress vmis') 102 | 103 | opsv.section_force_diagram_2d('M', 1.e-1, number_format='.1f') 104 | plt.title('Bending moment distribution') 105 | 106 | plt.show() 107 | -------------------------------------------------------------------------------- /doc/src/examples/demo_portal_frame_time_history_anim.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | 7 | # input_parameters = (3.8, 50., 100.) 8 | # input_parameters = (53.5767, 50., 100.) 9 | input_parameters = (20.8, 300., 8.) 10 | # input_parameters = (70.0, 500., 2.) 11 | 12 | pf, sfac_a, tkt = input_parameters 13 | 14 | ops.wipe() 15 | ops.model('basic', '-ndm', 2, '-ndf', 3) # frame 2D 16 | 17 | colL, girL = 4., 6. 18 | 19 | Acol, Agir = 0.06, 0.06 20 | IzCol, IzGir = 0.0002, 0.0002 21 | 22 | E = 3.2e10 23 | rho = 2400. 24 | muCol = rho * Acol 25 | muGir = rho * Agir 26 | massCol = ['-mass', muCol, '-cMass'] 27 | massGir = ['-mass', muGir, '-cMass'] 28 | 29 | ops.node(0, 0.0, 0.0) 30 | ops.node(1, 0.0, 2.0) 31 | ops.node(2, 0.0, 4.0) 32 | ops.node(3, 3.0, 4.0) 33 | ops.node(4, 6.0, 4.0) 34 | ops.node(5, 6.0, 2.0) 35 | ops.node(6, 6.0, 0.0) 36 | 37 | ops.fix(0, 1, 1, 1) 38 | ops.fix(6, 1, 1, 0) 39 | 40 | gTTag = 1 41 | ops.geomTransf('Linear', gTTag) 42 | 43 | # 1st column 44 | ops.element('elasticBeamColumn', 1, 0, 1, Acol, E, IzCol, gTTag, *massCol) 45 | ops.element('elasticBeamColumn', 2, 1, 2, Acol, E, IzCol, gTTag, *massCol) 46 | # girder 47 | ops.element('elasticBeamColumn', 3, 2, 3, Agir, E, IzGir, gTTag, *massGir) 48 | ops.element('elasticBeamColumn', 4, 3, 4, Agir, E, IzGir, gTTag, *massGir) 49 | # 2nd column 50 | ops.element('elasticBeamColumn', 5, 4, 5, Acol, E, IzCol, gTTag, *massCol) 51 | ops.element('elasticBeamColumn', 6, 5, 6, Acol, E, IzCol, gTTag, *massCol) 52 | 53 | t0 = 0. 54 | tk = 1. 55 | Tp = 1/pf 56 | P0 = 15000. 57 | dt = 0.002 58 | n_steps = int((tk-t0)/dt) 59 | 60 | tsTag = 1 61 | ops.timeSeries('Trig', tsTag, t0, tk, Tp, '-factor', P0) 62 | 63 | patTag = 1 64 | ops.pattern('Plain', patTag, tsTag) 65 | ops.load(1, 1., 0., 0.) 66 | 67 | ops.constraints('Transformation') 68 | ops.numberer('RCM') 69 | ops.test('NormDispIncr', 1.0e-6, 10, 1) 70 | ops.algorithm('Linear') 71 | ops.system('ProfileSPD') 72 | ops.integrator('Newmark', 0.5, 0.25) 73 | ops.analysis('Transient') 74 | 75 | el_tags = ops.getEleTags() 76 | 77 | nels = len(el_tags) 78 | 79 | Eds = np.zeros((n_steps, nels, 6)) 80 | timeV = np.zeros(n_steps) 81 | 82 | # transient analysis loop and collecting the data 83 | for step in range(n_steps): 84 | ops.analyze(1, dt) 85 | timeV[step] = ops.getTime() 86 | # collect disp for element nodes 87 | for el_i, ele_tag in enumerate(el_tags): 88 | nd1, nd2 = ops.eleNodes(ele_tag) 89 | Eds[step, el_i, :] = [ops.nodeDisp(nd1)[0], 90 | ops.nodeDisp(nd1)[1], 91 | ops.nodeDisp(nd1)[2], 92 | ops.nodeDisp(nd2)[0], 93 | ops.nodeDisp(nd2)[1], 94 | ops.nodeDisp(nd2)[2]] 95 | 96 | fmt_defo = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 3.0, 97 | 'marker': '', 'markersize': 6} 98 | 99 | # 1. animate the deformated shape 100 | anim = opsv.anim_defo(Eds, timeV, sfac_a, fmt_defo=fmt_defo, 101 | xlim=[-1, 7], ylim=[-1, 5], fig_wi_he=(30., 22.)) 102 | 103 | plt.show() 104 | 105 | # 2. after closing the window, animate the specified mode shape 106 | eigVals = ops.eigen(5) 107 | 108 | modeNo = 2 # specify which mode to animate 109 | f_modeNo = np.sqrt(eigVals[modeNo-1])/(2*np.pi) # i-th natural frequency 110 | 111 | anim = opsv.anim_mode(modeNo, fmt_defo=fmt_defo, 112 | xlim=[-1, 7], ylim=[-1, 5], fig_wi_he=(30., 22.)) 113 | plt.title(f'Mode {modeNo}, f_{modeNo}: {f_modeNo:.3f} Hz') 114 | 115 | plt.show() 116 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/4ae8a52b585d7ed65d7d5205344390a0/demo_cantilever_3el_3d.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | ops.wipe() 7 | 8 | ops.model('basic', '-ndm', 3, '-ndf', 6) 9 | 10 | b = 0.2 11 | h = 0.4 12 | 13 | A, Iz, Iy, J = 0.04, 0.0010667, 0.0002667, 0.01172 14 | 15 | E = 25.0e6 16 | G = 9615384.6 17 | 18 | # Lx, Ly, Lz = 4., 3., 5. 19 | Lx, Ly, Lz = 4., 4., 4. 20 | 21 | ops.node(1, 0., 0., 0.) 22 | ops.node(2, 0., 0., Lz) 23 | ops.node(3, Lx, 0., Lz) 24 | ops.node(4, Lx, Ly, Lz) 25 | 26 | ops.fix(1, 1, 1, 1, 1, 1, 1) 27 | 28 | lmass = 200. 29 | 30 | ops.mass(2, lmass, lmass, lmass, 0.001, 0.001, 0.001) 31 | ops.mass(3, lmass, lmass, lmass, 0.001, 0.001, 0.001) 32 | ops.mass(4, lmass, lmass, lmass, 0.001, 0.001, 0.001) 33 | 34 | gTTagz = 1 35 | gTTagx = 2 36 | gTTagy = 3 37 | 38 | coordTransf = 'Linear' 39 | ops.geomTransf(coordTransf, gTTagz, 0., -1., 0.) 40 | ops.geomTransf(coordTransf, gTTagx, 0., -1., 0.) 41 | ops.geomTransf(coordTransf, gTTagy, 1., 0., 0.) 42 | 43 | ops.element('elasticBeamColumn', 1, 1, 2, A, E, G, J, Iy, Iz, gTTagz) 44 | ops.element('elasticBeamColumn', 2, 2, 3, A, E, G, J, Iy, Iz, gTTagx) 45 | ops.element('elasticBeamColumn', 3, 3, 4, A, E, G, J, Iy, Iz, gTTagy) 46 | 47 | Ew = {} 48 | 49 | Px = -4.e1 50 | Py = -2.5e1 51 | Pz = -3.e1 52 | 53 | ops.timeSeries('Constant', 1) 54 | ops.pattern('Plain', 1, 1) 55 | ops.load(4, Px, Py, Pz, 0., 0., 0.) 56 | 57 | ops.constraints('Transformation') 58 | ops.numberer('RCM') 59 | ops.system('BandGeneral') 60 | ops.test('NormDispIncr', 1.0e-6, 6, 2) 61 | ops.algorithm('Linear') 62 | ops.integrator('LoadControl', 1) 63 | ops.analysis('Static') 64 | ops.analyze(1) 65 | 66 | 67 | opsv.plot_model() 68 | 69 | sfac = 2.0e0 70 | 71 | # fig_wi_he = 22., 14. 72 | fig_wi_he = 30., 20. 73 | 74 | # - 1 75 | nep = 9 76 | opsv.plot_defo(sfac, nep, az_el=(-68., 39.), 77 | fig_wi_he=fig_wi_he, endDispFlag=0) 78 | 79 | plt.title('3d 3-element cantilever beam') 80 | 81 | # - 2 82 | opsv.plot_defo(sfac, 19, az_el=(6., 30.), fig_wi_he=fig_wi_he) 83 | 84 | plt.title('3d 3-element cantilever beam') 85 | 86 | # - 3 87 | nfreq = 6 88 | eigValues = ops.eigen(nfreq) 89 | 90 | modeNo = 6 91 | 92 | sfac = 2.0e1 93 | opsv.plot_mode_shape(modeNo, sfac, 19, az_el=(106., 46.), 94 | fig_wi_he=fig_wi_he) 95 | plt.title(f'Mode {modeNo}') 96 | 97 | sfacN = 1.e-2 98 | sfacVy = 5.e-2 99 | sfacVz = 1.e-2 100 | sfacMy = 1.e-2 101 | sfacMz = 1.e-2 102 | sfacT = 1.e-2 103 | 104 | # plt.figure() 105 | opsv.section_force_diagram_3d('N', sfacN) 106 | plt.title('Axial force N') 107 | 108 | opsv.section_force_diagram_3d('Vy', sfacVy) 109 | plt.title('Transverse force Vy') 110 | 111 | opsv.section_force_diagram_3d('Vz', sfacVz) 112 | plt.title('Transverse force Vz') 113 | 114 | opsv.section_force_diagram_3d('My', sfacMy) 115 | plt.title('Bending moments My') 116 | 117 | opsv.section_force_diagram_3d('Mz', sfacMz) 118 | plt.title('Bending moments Mz') 119 | 120 | opsv.section_force_diagram_3d('T', sfacT) 121 | plt.title('Torsional moment T') 122 | 123 | # just for demonstration, 124 | # the section data below does not match the data in OpenSees model above 125 | # For now it can be source of inconsistency because OpenSees has 126 | # not got functions to return section dimensions. 127 | # A workaround is to have own Python helper functions to reuse data 128 | # specified once 129 | ele_shapes = {1: ['circ', [h]], 130 | 2: ['rect', [b, h]], 131 | 3: ['I', [b, h, b/10., h/6.]]} 132 | opsv.plot_extruded_shapes_3d(ele_shapes, fig_wi_he=fig_wi_he) 133 | 134 | plt.show() 135 | 136 | exit() 137 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/456a20c71721eaaff171c97a90110f6d/demo_ssi_portal_frame_fiber_section.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | import matplotlib.pyplot as plt 4 | 5 | ops.model('basic', '-ndm', 2, '-ndf', 2) 6 | 7 | Ls, Hs = 10, 4 8 | nx, ny = Ls, Hs 9 | E0, Ec, Es = 1000, 20.e6, 200.e6 10 | 11 | b, h = .2, .3 12 | A, Iz, As, c = b*h, b*h**3./12., 0.0002, 0.025 13 | y1, z1 = h/2., b/2. 14 | nFibZ, nFib = 1, 20 15 | 16 | sec_tag, nip, beam_integ_tag, transf_tag = 1, 5, 1, 1 17 | mat0_tag, mat1_tag, mat2_tag = 1, 2, 3 18 | 19 | ops.nDMaterial('ElasticIsotropic', mat0_tag, E0, .3) 20 | ops.uniaxialMaterial('Elastic', mat1_tag, Ec) 21 | ops.uniaxialMaterial('Elastic', mat2_tag, Es) 22 | 23 | ops.block2D(nx, ny, 1, 1, 'quad', mat0_tag, 'PlaneStress', 1, 24 | 1, 0., 0., 25 | 2, Ls, 0., 26 | 3, Ls, Hs, 27 | 4, 0., Hs) 28 | 29 | ops.fixY(0., 1, 1); ops.fixX(0., 1, 0); ops.fixX(Ls, 1, 0) 30 | 31 | ops.model('basic', '-ndm', 2, '-ndf', 3) 32 | 33 | ops.node(100, 2., 4.); ops.node(101, 2., 8.) 34 | ops.node(102, 1., 4.); ops.node(103, 3., 4.) 35 | ops.node(110, 8., 4.); ops.node(111, 8., 8.) 36 | ops.node(112, 7., 4.); ops.node(113, 9., 4.) 37 | 38 | ops.equalDOF(46, 102, 1, 2); ops.equalDOF(47, 100, 1, 2) 39 | ops.equalDOF(48, 103, 1, 2); ops.equalDOF(52, 112, 1, 2) 40 | ops.equalDOF(53, 110, 1, 2); ops.equalDOF(54, 113, 1, 2) 41 | 42 | fib_sec_1 = [['section', 'Fiber', sec_tag, '-GJ', 1.0e6], 43 | ['patch', 'rect', mat1_tag, nFib, nFibZ, -y1, -z1, y1, z1], 44 | ['layer', 'straight', mat2_tag, 3, As, y1-c, z1-c, y1-c, c-z1], 45 | ['layer', 'straight', mat2_tag, 3, As, c-y1, z1-c, c-y1, c-z1] 46 | ] 47 | 48 | matcolor = ['r', 'gold', 'w'] 49 | opsv.plot_fiber_section(fib_sec_1, matcolor=matcolor) 50 | plt.axis('equal') 51 | 52 | opsv.fib_sec_list_to_cmds(fib_sec_1) 53 | 54 | ops.beamIntegration('Lobatto', beam_integ_tag, sec_tag, nip) 55 | 56 | ops.geomTransf('Linear', transf_tag) 57 | ops.element('elasticBeamColumn', 101, 100, 101, A, Ec, Iz, 1) 58 | ops.element('elasticBeamColumn', 111, 110, 111, A, Ec, Iz, 1) 59 | 60 | ops.element('forceBeamColumn', 121, 101, 111, transf_tag, beam_integ_tag) 61 | 62 | ops.element('elasticBeamColumn', 103, 102, 100, A, Ec, Iz, transf_tag) 63 | ops.element('elasticBeamColumn', 104, 100, 103, A, Ec, Iz, transf_tag) 64 | 65 | ops.element('elasticBeamColumn', 113, 112, 110, A, Ec, Iz, transf_tag) 66 | ops.element('elasticBeamColumn', 114, 110, 113, A, Ec, Iz, transf_tag) 67 | 68 | Px, Py, Wy = 15., 2., -3. 69 | 70 | ops.timeSeries('Linear', 1) 71 | ops.pattern('Plain', 1, 1) 72 | ops.load(101, Px, -Py, 0.) 73 | 74 | ops.eleLoad('-ele', 121, '-type', '-beamUniform', Wy) 75 | 76 | ops.analysis('Static') 77 | ops.analyze(1) 78 | 79 | opsv.plot_model() 80 | opsv.plot_load() 81 | 82 | opsv.plot_defo(node_supports=0) 83 | plt.title('opsv.plot_defo(node_supports=0)') 84 | 85 | sfac = 20. 86 | 87 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 88 | opsv.plot_stress('sxx', sfac=sfac, ax=ax) 89 | plt.title('Stress sxx') 90 | 91 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 92 | opsv.plot_stress('syy', sfac=sfac, ax=ax) 93 | plt.title('Stress syy') 94 | 95 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 96 | opsv.plot_stress('sxy', sfac=sfac, ax=ax) 97 | plt.title('Stress sxy') 98 | 99 | _, ax = opsv.plot_defo(unDefoFlag=0, node_supports=0, sfac=sfac) 100 | opsv.plot_stress('vmis', sfac=sfac, ax=ax) 101 | plt.title('Stress vmis') 102 | 103 | opsv.section_force_diagram_2d('M', 1.e-1, number_format='.1f') 104 | plt.title('Bending moment distribution') 105 | 106 | plt.show() 107 | -------------------------------------------------------------------------------- /doc/build/html/_downloads/504b3e5c092f22d4d8708d2d1aa94b7d/demo_portal_frame_time_history_anim.py: -------------------------------------------------------------------------------- 1 | import openseespy.opensees as ops 2 | import opsvis as opsv 3 | 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | 7 | # input_parameters = (3.8, 50., 100.) 8 | # input_parameters = (53.5767, 50., 100.) 9 | input_parameters = (20.8, 300., 8.) 10 | # input_parameters = (70.0, 500., 2.) 11 | 12 | pf, sfac_a, tkt = input_parameters 13 | 14 | ops.wipe() 15 | ops.model('basic', '-ndm', 2, '-ndf', 3) # frame 2D 16 | 17 | colL, girL = 4., 6. 18 | 19 | Acol, Agir = 0.06, 0.06 20 | IzCol, IzGir = 0.0002, 0.0002 21 | 22 | E = 3.2e10 23 | rho = 2400. 24 | muCol = rho * Acol 25 | muGir = rho * Agir 26 | massCol = ['-mass', muCol, '-cMass'] 27 | massGir = ['-mass', muGir, '-cMass'] 28 | 29 | ops.node(0, 0.0, 0.0) 30 | ops.node(1, 0.0, 2.0) 31 | ops.node(2, 0.0, 4.0) 32 | ops.node(3, 3.0, 4.0) 33 | ops.node(4, 6.0, 4.0) 34 | ops.node(5, 6.0, 2.0) 35 | ops.node(6, 6.0, 0.0) 36 | 37 | ops.fix(0, 1, 1, 1) 38 | ops.fix(6, 1, 1, 0) 39 | 40 | gTTag = 1 41 | ops.geomTransf('Linear', gTTag) 42 | 43 | # 1st column 44 | ops.element('elasticBeamColumn', 1, 0, 1, Acol, E, IzCol, gTTag, *massCol) 45 | ops.element('elasticBeamColumn', 2, 1, 2, Acol, E, IzCol, gTTag, *massCol) 46 | # girder 47 | ops.element('elasticBeamColumn', 3, 2, 3, Agir, E, IzGir, gTTag, *massGir) 48 | ops.element('elasticBeamColumn', 4, 3, 4, Agir, E, IzGir, gTTag, *massGir) 49 | # 2nd column 50 | ops.element('elasticBeamColumn', 5, 4, 5, Acol, E, IzCol, gTTag, *massCol) 51 | ops.element('elasticBeamColumn', 6, 5, 6, Acol, E, IzCol, gTTag, *massCol) 52 | 53 | t0 = 0. 54 | tk = 1. 55 | Tp = 1/pf 56 | P0 = 15000. 57 | dt = 0.002 58 | n_steps = int((tk-t0)/dt) 59 | 60 | tsTag = 1 61 | ops.timeSeries('Trig', tsTag, t0, tk, Tp, '-factor', P0) 62 | 63 | patTag = 1 64 | ops.pattern('Plain', patTag, tsTag) 65 | ops.load(1, 1., 0., 0.) 66 | 67 | ops.constraints('Transformation') 68 | ops.numberer('RCM') 69 | ops.test('NormDispIncr', 1.0e-6, 10, 1) 70 | ops.algorithm('Linear') 71 | ops.system('ProfileSPD') 72 | ops.integrator('Newmark', 0.5, 0.25) 73 | ops.analysis('Transient') 74 | 75 | el_tags = ops.getEleTags() 76 | 77 | nels = len(el_tags) 78 | 79 | Eds = np.zeros((n_steps, nels, 6)) 80 | timeV = np.zeros(n_steps) 81 | 82 | # transient analysis loop and collecting the data 83 | for step in range(n_steps): 84 | ops.analyze(1, dt) 85 | timeV[step] = ops.getTime() 86 | # collect disp for element nodes 87 | for el_i, ele_tag in enumerate(el_tags): 88 | nd1, nd2 = ops.eleNodes(ele_tag) 89 | Eds[step, el_i, :] = [ops.nodeDisp(nd1)[0], 90 | ops.nodeDisp(nd1)[1], 91 | ops.nodeDisp(nd1)[2], 92 | ops.nodeDisp(nd2)[0], 93 | ops.nodeDisp(nd2)[1], 94 | ops.nodeDisp(nd2)[2]] 95 | 96 | fmt_defo = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 3.0, 97 | 'marker': '', 'markersize': 6} 98 | 99 | # 1. animate the deformated shape 100 | anim = opsv.anim_defo(Eds, timeV, sfac_a, fmt_defo=fmt_defo, 101 | xlim=[-1, 7], ylim=[-1, 5], fig_wi_he=(30., 22.)) 102 | 103 | plt.show() 104 | 105 | # 2. after closing the window, animate the specified mode shape 106 | eigVals = ops.eigen(5) 107 | 108 | modeNo = 2 # specify which mode to animate 109 | f_modeNo = np.sqrt(eigVals[modeNo-1])/(2*np.pi) # i-th natural frequency 110 | 111 | anim = opsv.anim_mode(modeNo, fmt_defo=fmt_defo, 112 | xlim=[-1, 7], ylim=[-1, 5], fig_wi_he=(30., 22.)) 113 | plt.title(f'Mode {modeNo}, f_{modeNo}: {f_modeNo:.3f} Hz') 114 | 115 | plt.show() 116 | -------------------------------------------------------------------------------- /doc/build/html/_static/_sphinx_javascript_frameworks_compat.js: -------------------------------------------------------------------------------- 1 | /* Compatability shim for jQuery and underscores.js. 2 | * 3 | * Copyright Sphinx contributors 4 | * Released under the two clause BSD licence 5 | */ 6 | 7 | /** 8 | * small helper function to urldecode strings 9 | * 10 | * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL 11 | */ 12 | jQuery.urldecode = function(x) { 13 | if (!x) { 14 | return x 15 | } 16 | return decodeURIComponent(x.replace(/\+/g, ' ')); 17 | }; 18 | 19 | /** 20 | * small helper function to urlencode strings 21 | */ 22 | jQuery.urlencode = encodeURIComponent; 23 | 24 | /** 25 | * This function returns the parsed url parameters of the 26 | * current request. Multiple values per key are supported, 27 | * it will always return arrays of strings for the value parts. 28 | */ 29 | jQuery.getQueryParameters = function(s) { 30 | if (typeof s === 'undefined') 31 | s = document.location.search; 32 | var parts = s.substr(s.indexOf('?') + 1).split('&'); 33 | var result = {}; 34 | for (var i = 0; i < parts.length; i++) { 35 | var tmp = parts[i].split('=', 2); 36 | var key = jQuery.urldecode(tmp[0]); 37 | var value = jQuery.urldecode(tmp[1]); 38 | if (key in result) 39 | result[key].push(value); 40 | else 41 | result[key] = [value]; 42 | } 43 | return result; 44 | }; 45 | 46 | /** 47 | * highlight a given string on a jquery object by wrapping it in 48 | * span elements with the given class name. 49 | */ 50 | jQuery.fn.highlightText = function(text, className) { 51 | function highlight(node, addItems) { 52 | if (node.nodeType === 3) { 53 | var val = node.nodeValue; 54 | var pos = val.toLowerCase().indexOf(text); 55 | if (pos >= 0 && 56 | !jQuery(node.parentNode).hasClass(className) && 57 | !jQuery(node.parentNode).hasClass("nohighlight")) { 58 | var span; 59 | var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); 60 | if (isInSVG) { 61 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 62 | } else { 63 | span = document.createElement("span"); 64 | span.className = className; 65 | } 66 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 67 | node.parentNode.insertBefore(span, node.parentNode.insertBefore( 68 | document.createTextNode(val.substr(pos + text.length)), 69 | node.nextSibling)); 70 | node.nodeValue = val.substr(0, pos); 71 | if (isInSVG) { 72 | var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 73 | var bbox = node.parentElement.getBBox(); 74 | rect.x.baseVal.value = bbox.x; 75 | rect.y.baseVal.value = bbox.y; 76 | rect.width.baseVal.value = bbox.width; 77 | rect.height.baseVal.value = bbox.height; 78 | rect.setAttribute('class', className); 79 | addItems.push({ 80 | "parent": node.parentNode, 81 | "target": rect}); 82 | } 83 | } 84 | } 85 | else if (!jQuery(node).is("button, select, textarea")) { 86 | jQuery.each(node.childNodes, function() { 87 | highlight(this, addItems); 88 | }); 89 | } 90 | } 91 | var addItems = []; 92 | var result = this.each(function() { 93 | highlight(this, addItems); 94 | }); 95 | for (var i = 0; i < addItems.length; ++i) { 96 | jQuery(addItems[i].parent).before(addItems[i].target); 97 | } 98 | return result; 99 | }; 100 | 101 | /* 102 | * backward compatibility for jQuery.browser 103 | * This will be supported until firefox bug is fixed. 104 | */ 105 | if (!jQuery.browser) { 106 | jQuery.uaMatch = function(ua) { 107 | ua = ua.toLowerCase(); 108 | 109 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || 110 | /(webkit)[ \/]([\w.]+)/.exec(ua) || 111 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || 112 | /(msie) ([\w.]+)/.exec(ua) || 113 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || 114 | []; 115 | 116 | return { 117 | browser: match[ 1 ] || "", 118 | version: match[ 2 ] || "0" 119 | }; 120 | }; 121 | jQuery.browser = {}; 122 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; 123 | } 124 | -------------------------------------------------------------------------------- /doc/build/html/_static/doctools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Base JavaScript utilities for all Sphinx HTML documentation. 3 | */ 4 | "use strict"; 5 | 6 | const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ 7 | "TEXTAREA", 8 | "INPUT", 9 | "SELECT", 10 | "BUTTON", 11 | ]); 12 | 13 | const _ready = (callback) => { 14 | if (document.readyState !== "loading") { 15 | callback(); 16 | } else { 17 | document.addEventListener("DOMContentLoaded", callback); 18 | } 19 | }; 20 | 21 | /** 22 | * Small JavaScript module for the documentation. 23 | */ 24 | const Documentation = { 25 | init: () => { 26 | Documentation.initDomainIndexTable(); 27 | Documentation.initOnKeyListeners(); 28 | }, 29 | 30 | /** 31 | * i18n support 32 | */ 33 | TRANSLATIONS: {}, 34 | PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), 35 | LOCALE: "unknown", 36 | 37 | // gettext and ngettext don't access this so that the functions 38 | // can safely bound to a different name (_ = Documentation.gettext) 39 | gettext: (string) => { 40 | const translated = Documentation.TRANSLATIONS[string]; 41 | switch (typeof translated) { 42 | case "undefined": 43 | return string; // no translation 44 | case "string": 45 | return translated; // translation exists 46 | default: 47 | return translated[0]; // (singular, plural) translation tuple exists 48 | } 49 | }, 50 | 51 | ngettext: (singular, plural, n) => { 52 | const translated = Documentation.TRANSLATIONS[singular]; 53 | if (typeof translated !== "undefined") 54 | return translated[Documentation.PLURAL_EXPR(n)]; 55 | return n === 1 ? singular : plural; 56 | }, 57 | 58 | addTranslations: (catalog) => { 59 | Object.assign(Documentation.TRANSLATIONS, catalog.messages); 60 | Documentation.PLURAL_EXPR = new Function( 61 | "n", 62 | `return (${catalog.plural_expr})` 63 | ); 64 | Documentation.LOCALE = catalog.locale; 65 | }, 66 | 67 | /** 68 | * helper function to focus on search bar 69 | */ 70 | focusSearchBar: () => { 71 | document.querySelectorAll("input[name=q]")[0]?.focus(); 72 | }, 73 | 74 | /** 75 | * Initialise the domain index toggle buttons 76 | */ 77 | initDomainIndexTable: () => { 78 | const toggler = (el) => { 79 | const idNumber = el.id.substr(7); 80 | const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); 81 | if (el.src.substr(-9) === "minus.png") { 82 | el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; 83 | toggledRows.forEach((el) => (el.style.display = "none")); 84 | } else { 85 | el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; 86 | toggledRows.forEach((el) => (el.style.display = "")); 87 | } 88 | }; 89 | 90 | const togglerElements = document.querySelectorAll("img.toggler"); 91 | togglerElements.forEach((el) => 92 | el.addEventListener("click", (event) => toggler(event.currentTarget)) 93 | ); 94 | togglerElements.forEach((el) => (el.style.display = "")); 95 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); 96 | }, 97 | 98 | initOnKeyListeners: () => { 99 | // only install a listener if it is really needed 100 | if ( 101 | !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && 102 | !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS 103 | ) 104 | return; 105 | 106 | document.addEventListener("keydown", (event) => { 107 | // bail for input elements 108 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 109 | // bail with special keys 110 | if (event.altKey || event.ctrlKey || event.metaKey) return; 111 | 112 | if (!event.shiftKey) { 113 | switch (event.key) { 114 | case "ArrowLeft": 115 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 116 | 117 | const prevLink = document.querySelector('link[rel="prev"]'); 118 | if (prevLink && prevLink.href) { 119 | window.location.href = prevLink.href; 120 | event.preventDefault(); 121 | } 122 | break; 123 | case "ArrowRight": 124 | if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; 125 | 126 | const nextLink = document.querySelector('link[rel="next"]'); 127 | if (nextLink && nextLink.href) { 128 | window.location.href = nextLink.href; 129 | event.preventDefault(); 130 | } 131 | break; 132 | } 133 | } 134 | 135 | // some keyboard layouts may need Shift to get / 136 | switch (event.key) { 137 | case "/": 138 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; 139 | Documentation.focusSearchBar(); 140 | event.preventDefault(); 141 | } 142 | }); 143 | }, 144 | }; 145 | 146 | // quick alias for translations 147 | const _ = Documentation.gettext; 148 | 149 | _ready(Documentation.init); 150 | -------------------------------------------------------------------------------- /doc/build/html/_static/pygments.css: -------------------------------------------------------------------------------- 1 | pre { line-height: 125%; } 2 | td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 3 | span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } 4 | td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 5 | span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } 6 | .highlight .hll { background-color: #ffffcc } 7 | .highlight { background: #f8f8f8; } 8 | .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ 9 | .highlight .err { border: 1px solid #FF0000 } /* Error */ 10 | .highlight .k { color: #008000; font-weight: bold } /* Keyword */ 11 | .highlight .o { color: #666666 } /* Operator */ 12 | .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ 13 | .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ 14 | .highlight .cp { color: #9C6500 } /* Comment.Preproc */ 15 | .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ 16 | .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ 17 | .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ 18 | .highlight .gd { color: #A00000 } /* Generic.Deleted */ 19 | .highlight .ge { font-style: italic } /* Generic.Emph */ 20 | .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ 21 | .highlight .gr { color: #E40000 } /* Generic.Error */ 22 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 23 | .highlight .gi { color: #008400 } /* Generic.Inserted */ 24 | .highlight .go { color: #717171 } /* Generic.Output */ 25 | .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 26 | .highlight .gs { font-weight: bold } /* Generic.Strong */ 27 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 28 | .highlight .gt { color: #0044DD } /* Generic.Traceback */ 29 | .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 30 | .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 31 | .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 32 | .highlight .kp { color: #008000 } /* Keyword.Pseudo */ 33 | .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 34 | .highlight .kt { color: #B00040 } /* Keyword.Type */ 35 | .highlight .m { color: #666666 } /* Literal.Number */ 36 | .highlight .s { color: #BA2121 } /* Literal.String */ 37 | .highlight .na { color: #687822 } /* Name.Attribute */ 38 | .highlight .nb { color: #008000 } /* Name.Builtin */ 39 | .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 40 | .highlight .no { color: #880000 } /* Name.Constant */ 41 | .highlight .nd { color: #AA22FF } /* Name.Decorator */ 42 | .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ 43 | .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ 44 | .highlight .nf { color: #0000FF } /* Name.Function */ 45 | .highlight .nl { color: #767600 } /* Name.Label */ 46 | .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 47 | .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 48 | .highlight .nv { color: #19177C } /* Name.Variable */ 49 | .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 50 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */ 51 | .highlight .mb { color: #666666 } /* Literal.Number.Bin */ 52 | .highlight .mf { color: #666666 } /* Literal.Number.Float */ 53 | .highlight .mh { color: #666666 } /* Literal.Number.Hex */ 54 | .highlight .mi { color: #666666 } /* Literal.Number.Integer */ 55 | .highlight .mo { color: #666666 } /* Literal.Number.Oct */ 56 | .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ 57 | .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 58 | .highlight .sc { color: #BA2121 } /* Literal.String.Char */ 59 | .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ 60 | .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 61 | .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 62 | .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ 63 | .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 64 | .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ 65 | .highlight .sx { color: #008000 } /* Literal.String.Other */ 66 | .highlight .sr { color: #A45A77 } /* Literal.String.Regex */ 67 | .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 68 | .highlight .ss { color: #19177C } /* Literal.String.Symbol */ 69 | .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 70 | .highlight .fm { color: #0000FF } /* Name.Function.Magic */ 71 | .highlight .vc { color: #19177C } /* Name.Variable.Class */ 72 | .highlight .vg { color: #19177C } /* Name.Variable.Global */ 73 | .highlight .vi { color: #19177C } /* Name.Variable.Instance */ 74 | .highlight .vm { color: #19177C } /* Name.Variable.Magic */ 75 | .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /opsvis/settings.py: -------------------------------------------------------------------------------- 1 | # default settings 2 | 3 | # fmt: format string setting color, marker and linestyle 4 | # check documentation on matplotlib's plot 5 | 6 | # element end nodes 7 | fmt_nodes = {'color': 'red', 'linestyle': 'None', 'linewidth': 1.2, 'marker': 's', 'markersize': 6} 8 | 9 | # initial model 10 | fmt_model = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '.', 'markersize': 6} 11 | fmt_model_truss = {'color': 'green', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': 'o', 'markersize': 6, 'markerfacecolor': 'white'} 12 | fmt_model_nodes_only = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '.', 'markersize': 6} 13 | fmt_model_loads = {'color': 'black', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1} 14 | fmt_model_rigid_offset = {'color': 'black', 'linestyle': 'solid', 'linewidth': 3.2, 'marker': '.', 'markersize': 1} 15 | 16 | fmt_model_joint2d = {'color': 'black', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1} 17 | fmt_model_secforce = {'color': 'black', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1} 18 | 19 | # deformed model 20 | fmt_defo = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1} 21 | fmt_defo_faces = {'linewidths': 1, 'edgecolors': 'k', 'alpha': 0.5} 22 | fmt_defo_zeroLenght = {'color': 'blue', 'linestyle': 'dashed', 'linewidth': 1.2, 'marker': '*', 'markersize': 6, 'markerfacecolor': 'white'} 23 | 24 | # undeformed model 25 | fmt_undefo = {'color': 'green', 'linestyle': (0, (1, 5)), 'linewidth': 1.2, 'marker': '', 'markersize': 1} 26 | fmt_undefo_faces = {'linewidths': 1, 'linestyles': 'dotted', 'edgecolors': 'g', 'facecolors': 'w', 'alpha': 0.5} 27 | 28 | # section forces 29 | fmt_secforce1 = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 2.0, 'marker': '', 30 | 'markersize': 1, 'solid_capstyle': 'round', 'solid_joinstyle': 'round', 31 | 'dash_capstyle': 'butt', 'dash_joinstyle': 'round'} 32 | fmt_secforce2 = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 1.0, 'marker': '', 33 | 'markersize': 1, 'solid_capstyle': 'round', 'solid_joinstyle': 'round', 34 | 'dash_capstyle': 'butt', 'dash_joinstyle': 'round'} 35 | 36 | fmt_secforce_tension = {'color': 'blue', 'linestyle': 'solid', 'linewidth': 2.0, 'marker': '', 'markersize': 1} 37 | fmt_secforce_compression = {'color': 'red', 'linestyle': 'solid', 'linewidth': 2.0, 'marker': '', 'markersize': 1} 38 | 39 | fmt_gauss_points = {'color': 'firebrick', 'linestyle': 'None', 'linewidth': 2.0, 'marker': 'X', 'markersize': 5} 40 | 41 | # figure left right bottom top offsets 42 | fig_lbrt = (.04, .04, .96, .96) 43 | fig_lbrt_model = (.08, .08, .985, .94) 44 | fig_lbrt_secforces = (.04, .08, .985, .92) 45 | fig_lbrt_defo = (.08, .08, .985, .92) 46 | fig_lbrt_mode = (.08, .08, .985, .92) 47 | 48 | # azimuth and elevation in degrees 49 | az_el = (-60., 30.) 50 | 51 | # figure width and height in centimeters 52 | fig_wi_he = (16., 10.) 53 | 54 | 55 | class EleClassTag: 56 | """ELE_TAG constants defined in SRC/classTags.h""" 57 | truss = 12 58 | trussSection = 13 59 | CorotTruss = 14 60 | ZeroLength = 19 61 | ZeroLengthSection = 20 62 | CoupledZeroLength = 26 63 | ElasticBeam2d = 3 64 | ElasticBeam3d = 5 65 | DispBeamColumn2d = 62 66 | DispBeamColumn3d = 64 67 | DispBeamColumn2dThermal = 128 68 | DispBeamColumn3dThermal = 130 69 | ForceBeamColumn2d = 73 70 | ForceBeamColumn3d = 74 71 | ForceBeamColumn2dThermal = 171 72 | ForceBeamColumn3dThermal = 172 73 | TimoshenkoBeamColumn2d = 63 74 | TimoshenkoBeamColumn3d = 631 75 | ElasticTimoshenkoBeam2d = 145 76 | ElasticTimoshenkoBeam3d = 146 77 | tri3n = 33 78 | tri6n = 209 79 | quad4n = 31 80 | quad4n3d = 32 81 | quad9n = 207 82 | quad8n = 208 83 | SSPquad = 119 84 | EnhancedQuad = 59 85 | brick20n = 49 86 | brick8n = 56 87 | SSPbrick = 121 88 | FourNodeTetrahedron = 179 89 | TenNodeTetrahedron = 256 90 | TenNodeTetrahedronSK = 1790 91 | ASDShellQ4 = 203 92 | ASDShellT3 = 204 93 | ShellMITC4 = 53 94 | ShellMITC9 = 54 95 | ShellDKGQ = 156 96 | ShellNLDKGQ = 157 97 | ShellDKGT = 167 98 | ShellNLDKGT = 168 99 | Joint2D = 82 100 | Joint3D = 83 101 | MVLEM = 162 102 | SFI_MVLEM = 163 103 | MVLEM_3D = 212 104 | SFI_MVLEM_3D = 213 105 | TwoNodeLink = 86 106 | MasonPan12 = 215 107 | Pipe = 269 108 | CurvedPipe = 270 109 | 110 | 111 | class LoadTag: 112 | """LOAD_TAG constants defined in SRC/classTags.h""" 113 | Beam2dUniformLoad = 3 114 | Beam2dUniformLoad_ndata = 2 115 | 116 | Beam2dPointLoad = 4 117 | Beam2dPointLoad_ndata = 3 118 | 119 | Beam3dUniformLoad = 5 120 | Beam3dUniformLoad_ndata = 3 121 | 122 | Beam3dPointLoad = 6 123 | Beam3dPointLoad_ndata = 4 124 | 125 | BrickSelfWeight = 7 126 | Beam2dTempLoad = 8 127 | SurfaceLoader = 9 128 | SelfWeight = 10 129 | Beam2dThermalAction = 11 130 | 131 | Beam2dPartialUniformLoad = 12 132 | Beam2dPartialUniformLoad_ndata = 6 133 | 134 | Beam3dPartialUniformLoad = 121 135 | Beam3dPartialUniformLoad_ndata = 5 136 | 137 | Beam3dThermalAction = 13 138 | ShellThermalAction = 14 139 | NodalThermalAction = 15 140 | ThermalActionWrapper = 16 141 | LysmerVelocityLoader = 17 142 | -------------------------------------------------------------------------------- /doc/build/html/_static/language_data.js: -------------------------------------------------------------------------------- 1 | /* 2 | * This script contains the language-specific data used by searchtools.js, 3 | * namely the list of stopwords, stemmer, scorer and splitter. 4 | */ 5 | 6 | var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; 7 | 8 | 9 | /* Non-minified version is copied as a separate JS file, if available */ 10 | 11 | /** 12 | * Porter Stemmer 13 | */ 14 | var Stemmer = function() { 15 | 16 | var step2list = { 17 | ational: 'ate', 18 | tional: 'tion', 19 | enci: 'ence', 20 | anci: 'ance', 21 | izer: 'ize', 22 | bli: 'ble', 23 | alli: 'al', 24 | entli: 'ent', 25 | eli: 'e', 26 | ousli: 'ous', 27 | ization: 'ize', 28 | ation: 'ate', 29 | ator: 'ate', 30 | alism: 'al', 31 | iveness: 'ive', 32 | fulness: 'ful', 33 | ousness: 'ous', 34 | aliti: 'al', 35 | iviti: 'ive', 36 | biliti: 'ble', 37 | logi: 'log' 38 | }; 39 | 40 | var step3list = { 41 | icate: 'ic', 42 | ative: '', 43 | alize: 'al', 44 | iciti: 'ic', 45 | ical: 'ic', 46 | ful: '', 47 | ness: '' 48 | }; 49 | 50 | var c = "[^aeiou]"; // consonant 51 | var v = "[aeiouy]"; // vowel 52 | var C = c + "[^aeiouy]*"; // consonant sequence 53 | var V = v + "[aeiou]*"; // vowel sequence 54 | 55 | var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 56 | var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 57 | var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 58 | var s_v = "^(" + C + ")?" + v; // vowel in stem 59 | 60 | this.stemWord = function (w) { 61 | var stem; 62 | var suffix; 63 | var firstch; 64 | var origword = w; 65 | 66 | if (w.length < 3) 67 | return w; 68 | 69 | var re; 70 | var re2; 71 | var re3; 72 | var re4; 73 | 74 | firstch = w.substr(0,1); 75 | if (firstch == "y") 76 | w = firstch.toUpperCase() + w.substr(1); 77 | 78 | // Step 1a 79 | re = /^(.+?)(ss|i)es$/; 80 | re2 = /^(.+?)([^s])s$/; 81 | 82 | if (re.test(w)) 83 | w = w.replace(re,"$1$2"); 84 | else if (re2.test(w)) 85 | w = w.replace(re2,"$1$2"); 86 | 87 | // Step 1b 88 | re = /^(.+?)eed$/; 89 | re2 = /^(.+?)(ed|ing)$/; 90 | if (re.test(w)) { 91 | var fp = re.exec(w); 92 | re = new RegExp(mgr0); 93 | if (re.test(fp[1])) { 94 | re = /.$/; 95 | w = w.replace(re,""); 96 | } 97 | } 98 | else if (re2.test(w)) { 99 | var fp = re2.exec(w); 100 | stem = fp[1]; 101 | re2 = new RegExp(s_v); 102 | if (re2.test(stem)) { 103 | w = stem; 104 | re2 = /(at|bl|iz)$/; 105 | re3 = new RegExp("([^aeiouylsz])\\1$"); 106 | re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 107 | if (re2.test(w)) 108 | w = w + "e"; 109 | else if (re3.test(w)) { 110 | re = /.$/; 111 | w = w.replace(re,""); 112 | } 113 | else if (re4.test(w)) 114 | w = w + "e"; 115 | } 116 | } 117 | 118 | // Step 1c 119 | re = /^(.+?)y$/; 120 | if (re.test(w)) { 121 | var fp = re.exec(w); 122 | stem = fp[1]; 123 | re = new RegExp(s_v); 124 | if (re.test(stem)) 125 | w = stem + "i"; 126 | } 127 | 128 | // Step 2 129 | re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 130 | if (re.test(w)) { 131 | var fp = re.exec(w); 132 | stem = fp[1]; 133 | suffix = fp[2]; 134 | re = new RegExp(mgr0); 135 | if (re.test(stem)) 136 | w = stem + step2list[suffix]; 137 | } 138 | 139 | // Step 3 140 | re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 141 | if (re.test(w)) { 142 | var fp = re.exec(w); 143 | stem = fp[1]; 144 | suffix = fp[2]; 145 | re = new RegExp(mgr0); 146 | if (re.test(stem)) 147 | w = stem + step3list[suffix]; 148 | } 149 | 150 | // Step 4 151 | re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 152 | re2 = /^(.+?)(s|t)(ion)$/; 153 | if (re.test(w)) { 154 | var fp = re.exec(w); 155 | stem = fp[1]; 156 | re = new RegExp(mgr1); 157 | if (re.test(stem)) 158 | w = stem; 159 | } 160 | else if (re2.test(w)) { 161 | var fp = re2.exec(w); 162 | stem = fp[1] + fp[2]; 163 | re2 = new RegExp(mgr1); 164 | if (re2.test(stem)) 165 | w = stem; 166 | } 167 | 168 | // Step 5 169 | re = /^(.+?)e$/; 170 | if (re.test(w)) { 171 | var fp = re.exec(w); 172 | stem = fp[1]; 173 | re = new RegExp(mgr1); 174 | re2 = new RegExp(meq1); 175 | re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 176 | if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 177 | w = stem; 178 | } 179 | re = /ll$/; 180 | re2 = new RegExp(mgr1); 181 | if (re.test(w) && re2.test(w)) { 182 | re = /.$/; 183 | w = w.replace(re,""); 184 | } 185 | 186 | // and turn initial Y back to y 187 | if (firstch == "y") 188 | w = firstch.toLowerCase() + w.substr(1); 189 | return w; 190 | } 191 | } 192 | 193 | -------------------------------------------------------------------------------- /doc/build/html/genindex.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Index — opsvis 1.3.3 documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 66 | 67 |
71 | 72 |
73 |
74 |
75 |
    76 |
  • 77 | 78 |
  • 79 |
  • 80 |
81 |
82 |
83 |
84 |
85 | 86 | 87 |

Index

88 | 89 |
90 | 91 |
92 | 93 | 94 |
95 |
96 |
97 | 98 |
99 | 100 |
101 |

© Copyright 2025, Seweryn Kokot.

102 |
103 | 104 | Built with Sphinx using a 105 | theme 106 | provided by Read the Docs. 107 | 108 | 109 |
110 |
111 |
112 |
113 |
114 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /doc/build/html/_static/sphinx_highlight.js: -------------------------------------------------------------------------------- 1 | /* Highlighting utilities for Sphinx HTML documentation. */ 2 | "use strict"; 3 | 4 | const SPHINX_HIGHLIGHT_ENABLED = true 5 | 6 | /** 7 | * highlight a given string on a node by wrapping it in 8 | * span elements with the given class name. 9 | */ 10 | const _highlight = (node, addItems, text, className) => { 11 | if (node.nodeType === Node.TEXT_NODE) { 12 | const val = node.nodeValue; 13 | const parent = node.parentNode; 14 | const pos = val.toLowerCase().indexOf(text); 15 | if ( 16 | pos >= 0 && 17 | !parent.classList.contains(className) && 18 | !parent.classList.contains("nohighlight") 19 | ) { 20 | let span; 21 | 22 | const closestNode = parent.closest("body, svg, foreignObject"); 23 | const isInSVG = closestNode && closestNode.matches("svg"); 24 | if (isInSVG) { 25 | span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); 26 | } else { 27 | span = document.createElement("span"); 28 | span.classList.add(className); 29 | } 30 | 31 | span.appendChild(document.createTextNode(val.substr(pos, text.length))); 32 | const rest = document.createTextNode(val.substr(pos + text.length)); 33 | parent.insertBefore( 34 | span, 35 | parent.insertBefore( 36 | rest, 37 | node.nextSibling 38 | ) 39 | ); 40 | node.nodeValue = val.substr(0, pos); 41 | /* There may be more occurrences of search term in this node. So call this 42 | * function recursively on the remaining fragment. 43 | */ 44 | _highlight(rest, addItems, text, className); 45 | 46 | if (isInSVG) { 47 | const rect = document.createElementNS( 48 | "http://www.w3.org/2000/svg", 49 | "rect" 50 | ); 51 | const bbox = parent.getBBox(); 52 | rect.x.baseVal.value = bbox.x; 53 | rect.y.baseVal.value = bbox.y; 54 | rect.width.baseVal.value = bbox.width; 55 | rect.height.baseVal.value = bbox.height; 56 | rect.setAttribute("class", className); 57 | addItems.push({ parent: parent, target: rect }); 58 | } 59 | } 60 | } else if (node.matches && !node.matches("button, select, textarea")) { 61 | node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); 62 | } 63 | }; 64 | const _highlightText = (thisNode, text, className) => { 65 | let addItems = []; 66 | _highlight(thisNode, addItems, text, className); 67 | addItems.forEach((obj) => 68 | obj.parent.insertAdjacentElement("beforebegin", obj.target) 69 | ); 70 | }; 71 | 72 | /** 73 | * Small JavaScript module for the documentation. 74 | */ 75 | const SphinxHighlight = { 76 | 77 | /** 78 | * highlight the search words provided in localstorage in the text 79 | */ 80 | highlightSearchWords: () => { 81 | if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight 82 | 83 | // get and clear terms from localstorage 84 | const url = new URL(window.location); 85 | const highlight = 86 | localStorage.getItem("sphinx_highlight_terms") 87 | || url.searchParams.get("highlight") 88 | || ""; 89 | localStorage.removeItem("sphinx_highlight_terms") 90 | url.searchParams.delete("highlight"); 91 | window.history.replaceState({}, "", url); 92 | 93 | // get individual terms from highlight string 94 | const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); 95 | if (terms.length === 0) return; // nothing to do 96 | 97 | // There should never be more than one element matching "div.body" 98 | const divBody = document.querySelectorAll("div.body"); 99 | const body = divBody.length ? divBody[0] : document.querySelector("body"); 100 | window.setTimeout(() => { 101 | terms.forEach((term) => _highlightText(body, term, "highlighted")); 102 | }, 10); 103 | 104 | const searchBox = document.getElementById("searchbox"); 105 | if (searchBox === null) return; 106 | searchBox.appendChild( 107 | document 108 | .createRange() 109 | .createContextualFragment( 110 | '" 114 | ) 115 | ); 116 | }, 117 | 118 | /** 119 | * helper function to hide the search marks again 120 | */ 121 | hideSearchWords: () => { 122 | document 123 | .querySelectorAll("#searchbox .highlight-link") 124 | .forEach((el) => el.remove()); 125 | document 126 | .querySelectorAll("span.highlighted") 127 | .forEach((el) => el.classList.remove("highlighted")); 128 | localStorage.removeItem("sphinx_highlight_terms") 129 | }, 130 | 131 | initEscapeListener: () => { 132 | // only install a listener if it is really needed 133 | if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; 134 | 135 | document.addEventListener("keydown", (event) => { 136 | // bail for input elements 137 | if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; 138 | // bail with special keys 139 | if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; 140 | if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { 141 | SphinxHighlight.hideSearchWords(); 142 | event.preventDefault(); 143 | } 144 | }); 145 | }, 146 | }; 147 | 148 | _ready(() => { 149 | /* Do not call highlightSearchWords() when we are on the search page. 150 | * It will highlight words from the *previous* search query. 151 | */ 152 | if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); 153 | SphinxHighlight.initEscapeListener(); 154 | }); 155 | -------------------------------------------------------------------------------- /doc/build/html/_modules/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Overview: module code — opsvis 1.3.3 documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 66 | 67 |
71 | 72 |
73 |
74 |
75 |
    76 |
  • 77 | 78 |
  • 79 |
  • 80 |
81 |
82 |
83 |
84 |
85 | 86 |

All modules for which code is available

87 | 94 | 95 |
96 |
97 |
98 | 99 |
100 | 101 |
102 |

© Copyright 2025, Seweryn Kokot.

103 |
104 | 105 | Built with Sphinx using a 106 | theme 107 | provided by Read the Docs. 108 | 109 | 110 |
111 |
112 |
113 |
114 |
115 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /doc/build/html/search.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Search — opsvis 1.3.3 documentation 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 69 | 70 |
74 | 75 |
76 |
77 |
78 |
    79 |
  • 80 | 81 |
  • 82 |
  • 83 |
84 |
85 |
86 |
87 |
88 | 89 | 96 | 97 | 98 |
99 | 100 |
101 | 102 |
103 |
104 |
105 | 106 |
107 | 108 |
109 |

© Copyright 2025, Seweryn Kokot.

110 |
111 | 112 | Built with Sphinx using a 113 | theme 114 | provided by Read the Docs. 115 | 116 | 117 |
118 |
119 |
120 |
121 |
122 | 127 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /doc/build/html/plot_supports_and_loads_2d.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | plot_supports_and_loads_2d — opsvis 0.94.9 documentation 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 58 | 59 |
63 | 64 |
65 |
66 |
67 | 74 |
75 |
76 |
77 |
78 | 79 |
80 |

plot_supports_and_loads_2d

81 |
82 |
83 | opsvis.plot_supports_and_loads_2d(nep=17, sfac=False)[source]
84 |

Display the supports and the loads applied to the 2d beam-column models 85 | (nodal and element loads).

86 |
87 |
Parameters
88 |

nep (int) – number of arrows when displacing element distributed loads 89 | (default: 17)

90 |
91 |
92 |
93 | 94 |
95 | 96 | 97 |
98 |
99 |
103 | 104 |
105 | 106 |
107 |

© Copyright 2021, Seweryn Kokot.

108 |
109 | 110 | Built with Sphinx using a 111 | theme 112 | provided by Read the Docs. 113 | 114 | 115 |
116 |
117 |
118 |
119 |
120 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /doc/build/html/_static/js/versions.js: -------------------------------------------------------------------------------- 1 | const themeFlyoutDisplay = "hidden"; 2 | const themeVersionSelector = true; 3 | const themeLanguageSelector = true; 4 | 5 | if (themeFlyoutDisplay === "attached") { 6 | function renderLanguages(config) { 7 | if (!config.projects.translations.length) { 8 | return ""; 9 | } 10 | 11 | // Insert the current language to the options on the selector 12 | let languages = config.projects.translations.concat(config.projects.current); 13 | languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name)); 14 | 15 | const languagesHTML = ` 16 |
17 |
Languages
18 | ${languages 19 | .map( 20 | (translation) => ` 21 |
22 | ${translation.language.code} 23 |
24 | `, 25 | ) 26 | .join("\n")} 27 |
28 | `; 29 | return languagesHTML; 30 | } 31 | 32 | function renderVersions(config) { 33 | if (!config.versions.active.length) { 34 | return ""; 35 | } 36 | const versionsHTML = ` 37 |
38 |
Versions
39 | ${config.versions.active 40 | .map( 41 | (version) => ` 42 |
43 | ${version.slug} 44 |
45 | `, 46 | ) 47 | .join("\n")} 48 |
49 | `; 50 | return versionsHTML; 51 | } 52 | 53 | function renderDownloads(config) { 54 | if (!Object.keys(config.versions.current.downloads).length) { 55 | return ""; 56 | } 57 | const downloadsNameDisplay = { 58 | pdf: "PDF", 59 | epub: "Epub", 60 | htmlzip: "HTML", 61 | }; 62 | 63 | const downloadsHTML = ` 64 |
65 |
Downloads
66 | ${Object.entries(config.versions.current.downloads) 67 | .map( 68 | ([name, url]) => ` 69 |
70 | ${downloadsNameDisplay[name]} 71 |
72 | `, 73 | ) 74 | .join("\n")} 75 |
76 | `; 77 | return downloadsHTML; 78 | } 79 | 80 | document.addEventListener("readthedocs-addons-data-ready", function (event) { 81 | const config = event.detail.data(); 82 | 83 | const flyout = ` 84 |
85 | 86 | Read the Docs 87 | v: ${config.versions.current.slug} 88 | 89 | 90 |
91 |
92 | ${renderLanguages(config)} 93 | ${renderVersions(config)} 94 | ${renderDownloads(config)} 95 |
96 |
On Read the Docs
97 |
98 | Project Home 99 |
100 |
101 | Builds 102 |
103 |
104 | Downloads 105 |
106 |
107 |
108 |
Search
109 |
110 |
111 | 118 |
119 |
120 |
121 |
122 | 123 | Hosted by Read the Docs 124 | 125 |
126 |
127 | `; 128 | 129 | // Inject the generated flyout into the body HTML element. 130 | document.body.insertAdjacentHTML("beforeend", flyout); 131 | 132 | // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. 133 | document 134 | .querySelector("#flyout-search-form") 135 | .addEventListener("focusin", () => { 136 | const event = new CustomEvent("readthedocs-search-show"); 137 | document.dispatchEvent(event); 138 | }); 139 | }) 140 | } 141 | 142 | if (themeLanguageSelector || themeVersionSelector) { 143 | function onSelectorSwitch(event) { 144 | const option = event.target.selectedIndex; 145 | const item = event.target.options[option]; 146 | window.location.href = item.dataset.url; 147 | } 148 | 149 | document.addEventListener("readthedocs-addons-data-ready", function (event) { 150 | const config = event.detail.data(); 151 | 152 | const versionSwitch = document.querySelector( 153 | "div.switch-menus > div.version-switch", 154 | ); 155 | if (themeVersionSelector) { 156 | let versions = config.versions.active; 157 | if (config.versions.current.hidden || config.versions.current.type === "external") { 158 | versions.unshift(config.versions.current); 159 | } 160 | const versionSelect = ` 161 | 174 | `; 175 | 176 | versionSwitch.innerHTML = versionSelect; 177 | versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); 178 | } 179 | 180 | const languageSwitch = document.querySelector( 181 | "div.switch-menus > div.language-switch", 182 | ); 183 | 184 | if (themeLanguageSelector) { 185 | if (config.projects.translations.length) { 186 | // Add the current language to the options on the selector 187 | let languages = config.projects.translations.concat( 188 | config.projects.current, 189 | ); 190 | languages = languages.sort((a, b) => 191 | a.language.name.localeCompare(b.language.name), 192 | ); 193 | 194 | const languageSelect = ` 195 | 208 | `; 209 | 210 | languageSwitch.innerHTML = languageSelect; 211 | languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); 212 | } 213 | else { 214 | languageSwitch.remove(); 215 | } 216 | } 217 | }); 218 | } 219 | 220 | document.addEventListener("readthedocs-addons-data-ready", function (event) { 221 | // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. 222 | document 223 | .querySelector("[role='search'] input") 224 | .addEventListener("focusin", () => { 225 | const event = new CustomEvent("readthedocs-search-show"); 226 | document.dispatchEvent(event); 227 | }); 228 | }); -------------------------------------------------------------------------------- /doc/build/html/examples.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Examples — opsvis 1.3.3 documentation 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 77 | 78 |
82 | 83 |
84 |
85 |
86 | 93 |
94 |
95 | 115 |
119 | 120 |
121 | 122 |
123 |

© Copyright 2025, Seweryn Kokot.

124 |
125 | 126 | Built with Sphinx using a 127 | theme 128 | provided by Read the Docs. 129 | 130 | 131 |
132 |
133 |
134 |
135 |
136 | 141 | 142 | 143 | -------------------------------------------------------------------------------- /doc/build/html/plot_loads_2d.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | plot_loads_2d — opsvis 0.99.1 documentation 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 58 | 59 |
63 | 64 |
65 |
66 |
67 | 74 |
75 |
76 |
77 |
78 | 79 |
80 |

plot_loads_2d

81 |
82 |
83 | opsvis.plot_loads_2d(nep=17, sfac=False, fig_wi_he=False, fig_lbrt=False, fmt_model_loads={'color': 'black', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1}, node_supports=True, ax=False)[source]
84 |

Display the nodal and element loads applied to the 2d models.

85 |
86 |
Parameters
87 |
    88 |
  • nep (int) – number of arrows when displacing element distributed loads 89 | (default: 17)

  • 90 |
  • node_supports (bool) – True - show the node support conditions. 91 | Default: False.

  • 92 |
93 |
94 |
95 |
96 | 97 |
98 | 99 | 100 |
101 |
102 |
106 | 107 |
108 | 109 |
110 |

© Copyright 2022, Seweryn Kokot.

111 |
112 | 113 | Built with Sphinx using a 114 | theme 115 | provided by Read the Docs. 116 | 117 | 118 |
119 |
120 |
121 |
122 |
123 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /doc/build/html/fib_sec_list_to_cmds.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | fib_sec_list_to_cmds — opsvis 1.3.3 documentation 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 69 | 70 |
74 | 75 |
76 |
77 |
78 | 85 |
86 |
87 |
88 |
89 | 90 |
91 |

fib_sec_list_to_cmds

92 |
93 |
94 | opsvis.fib_sec_list_to_cmds(fib_sec_list)[source]
95 |

Reuses fib_sec_list to define fiber section in OpenSees.

96 |

At present it is not possible to extract fiber section data from 97 | the OpenSees domain, this function is a workaround. The idea is to 98 | prepare data similar to the one the regular OpenSees commands 99 | (section('Fiber', ...), fiber(), patch() and/or 100 | layer()) require.

101 |
102 |
Parameters:
103 |
    104 |
  • fib_sec_list (list) – is a list of fiber section data. First sub-list

  • 105 |
  • stiffness (also defines the torsional)

  • 106 |
107 |
108 |
109 |

Warning:

110 |

If you use this function, do not issue the regular OpenSees: 111 | section, Fiber, Patch or Layer commands.

112 |

See also:

113 |

opsvis.plot_fiber_section()

114 |
115 | 116 |

See example Plot steel and reinforced concrete fiber sections

117 |
118 | 119 | 120 |
121 |
122 |
126 | 127 |
128 | 129 |
130 |

© Copyright 2025, Seweryn Kokot.

131 |
132 | 133 | Built with Sphinx using a 134 | theme 135 | provided by Read the Docs. 136 | 137 | 138 |
139 |
140 |
141 |
142 |
143 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /doc/build/html/plot_reactions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | plot_reactions — opsvis 1.3.3 documentation 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 69 | 70 |
74 | 75 |
76 |
77 |
78 | 85 |
86 |
87 |
88 |
89 | 90 |
91 |

plot_reactions

92 |
93 |
94 | opsvis.plot_reactions(sfac=False, fig_wi_he=False, fig_lbrt=False, fmt_model_loads={'color': 'black', 'linestyle': 'solid', 'linewidth': 1.2, 'marker': '', 'markersize': 1}, truss_node_offset=0, local_axes=False, ax=False)[source]
95 |

Display support reactions of 2d and 3d models.

96 |
97 | 98 |
99 | 100 | 101 |
102 |
103 |
107 | 108 |
109 | 110 |
111 |

© Copyright 2025, Seweryn Kokot.

112 |
113 | 114 | Built with Sphinx using a 115 | theme 116 | provided by Read the Docs. 117 | 118 | 119 |
120 |
121 |
122 |
123 |
124 | 129 | 130 | 131 | --------------------------------------------------------------------------------